一、原码、反码、补码
原码:符号位(正数为0、负数为1)+二进制数
 反码:正数的反码=正数的原码;负数的反码=负数的原码除符号位外按位求反
 补码:正数的补码=正数的反码;负数的补码=负数的反码+1
| 整数 | 原码 | 反码 | 补码 | 
|---|---|---|---|
| +7 | 0111 | 0111 | 0111 | 
| -7 | 1111 | 1000 | 1001 | 
二、与(&)、或(|)、异或(^)
1&1=1,1|1=1
 1&0=0,1|0=1
 0&1=0,0|1=1
 0&0=0,0|0=0
 1 ^ 1=0,1 ^ 0=1
 0 ^ 1=1,0 ^ 0=0
 x ^ x=0,x ^ 0=x
 a ^ b ^ c=a ^ c ^ b=b ^ c ^ a
 例:
 7&3=111&011=011=3
 7|3=111|011=111=7
 7 ^ 3=111 ^ 011=100=4
三、移位运算
①7<<2
 7的补码:0000 0111
 向左移两位:0001 1100
 
    
     
      
       
        7
       
       
        <
       
       
        <
       
       
        2
       
       
        =
       
       
        7
       
       
        ∗
       
       
        
         2
        
        
         2
        
       
       
        =
       
       
        28
       
      
      
       7<<2=7*2^2=28
      
     
    7<<2=7∗22=28
 
    
     
      
       
        7
       
       
        <
       
       
        <
       
       
        n
       
       
        =
       
       
        7
       
       
        ∗
       
       
        
         2
        
        
         n
        
       
      
      
       7<<n=7*2^n
      
     
    7<<n=7∗2n
②7>>2
 7的补码:0000 0111
 向右移两位:0000 0001
 
    
     
      
       
        7
       
       
        >
       
       
        >
       
       
        2
       
       
        =
       
       
        7
       
       
        /
       
       
        
         2
        
        
         2
        
       
       
        =
       
       
        7
       
       
        /
       
       
        4
       
       
        =
       
       
        1
       
      
      
       7>>2=7/2^2=7/4=1
      
     
    7>>2=7/22=7/4=1
③-7<<2
 -7的补码:1111 1001
 向左移两位:1110 0100
 
    
     
      
       
        −
       
       
        7
       
       
        <
       
       
        <
       
       
        2
       
       
        =
       
       
        −
       
       
        28
       
      
      
       -7<<2=-28
      
     
    −7<<2=−28
④-7>>2
 -7的补码:1111 1001
 向右移两位:1111 1110
 
    
     
      
       
        −
       
       
        7
       
       
        >
       
       
        >
       
       
        2
       
       
        =
       
       
        −
       
       
        2
       
      
      
       -7>>2=-2
      
     
    −7>>2=−2
 规则:>> 表示右移,如果该数为正,则高位补0,若为负数,则高位补1。
例题:
 ①-7>>3计算过程:
 -7的补码:1111 1001
 向右移三位:1111 1111(补码)→1111 1110(反码)→1000 0001(原码)=-1(D)
 
    
     
      
       
        −
       
       
        7
       
       
        >
       
       
        >
       
       
        3
       
       
        =
       
       
        −
       
       
        1
       
      
      
       -7>>3=-1
      
     
    −7>>3=−1
②-7>>>3计算过程:
 -7的补码:11111111 11111111 11111111 11111001
 向右无符号移三位:00011111 11111111 11111111 11111111(补码)=536870911(D)
 
    
     
      
       
        −
       
       
        7
       
       
        >
       
       
        >
       
       
        >
       
       
        3
       
       
        =
       
       
        536870911
       
      
      
       -7>>>3=536870911
      
     
    −7>>>3=536870911
 规则:>>>表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0。
四、经典例题
1、题目介绍:
 输入一个正整数n,判断n是否为
    
     
      
       
        
         2
        
        
         k
        
       
      
      
       2^k
      
     
    2k,如果是输出“yes”,否则输出"no"。
思路分析:
 
    
     
      
       
        4
       
       
        =
       
       
        
         2
        
        
         2
        
       
      
      
       4=2^2
      
     
    4=22,二进制为100
 
    
     
      
       
        8
       
       
        =
       
       
        
         2
        
        
         3
        
       
      
      
       8=2^3
      
     
    8=23,二进制为1000
 
    
     
      
       
        16
       
       
        =
       
       
        
         2
        
        
         4
        
       
      
      
       16=2^4
      
     
    16=24,二进制为10000
 将正整数n转成二进制,判断其是否为1开头,后面全0
 或者:8→1000;7→0100;8&7=1000&0100=0000=0
 即:n&(n-1)==0?“yes”:“no”
程序代码:
import java.util.Scanner;
public class Test {
	public static void main(String[] args) {
		int n = 0;
		Scanner sc = new Scanner(System.in);
		while(sc.hasNext()) {
			n = sc.nextInt();
			System.out.println((n&(n-1))==0?"yes":"no");
		}
	}
}
 
2、题目介绍:
 输入一个十进制正整数n,输出n的二进制中1的个数。
思路分析:
 n&(n-1):把n的二进制最右边的1置为0
 
程序代码:
import java.util.Scanner;
public class Test {
	public static void main(String[] args) {
		int n = 0;
		Scanner sc = new Scanner(System.in);
		while(sc.hasNext()) {
			n = sc.nextInt();
			int count = 0;//统计n的二进制中1的个数
			while(n > 0) {
				n = n&(n-1);//把n的最右边的1置为0
				count++;
			}
			System.out.println(count);
		}
	}
}
 
3、题目介绍:
 Find your present! (找到你的礼物)
 输入两行数,第一行输入数n,第二行输入2n-1个整数,输出只出现一次的整数。
样例输入:
4
1 2 3 2 1 4 4
2
1 2 1
 
样例输出:
3
2
 
思路分析:
 使用异或位运算
 例:1 ^ 2 ^ 3 ^ 2 ^ 1 ^ 4 ^ 4= 0 ^ 1 ^ 1 ^ 2 ^ 2 ^ 4 ^ 4 ^ 3=0 ^ 0 ^ 0 ^ 0 ^ 3=0 ^ 3=3
程序代码:
import java.util.Scanner;
public class Test {
	public static void main(String[] args) {
		int n = 0;
		Scanner sc = new Scanner(System.in);
		while(sc.hasNext()) {
			n = sc.nextInt();
			int ans = 0;
			for(int i=1;i<=2*n-1;i++)
				ans = ans ^ sc.nextInt();
			System.out.println(ans);
		}
	}
}
                











![[Linux]进程地址空间](https://img-blog.csdnimg.cn/980719c3338f4eea8c90e2219186019e.png)






