负数二进制表现形式
负数是以补码的形式表示,其转换方式,简单的一句话就是:先按正数转换,然后取反加1。负数的二进制最高位是1。
要将十进制的-10用二进制表示,先将10用二进制表示:
0000 0000 0000 1010
取反:
1111 1111 1111 0101
加1:
1111 1111 1111 0110
所以,-10的二进制表示就是:1111 1111 1111 0110
按位与( & ) ---- 同1为1,否则为0
1. 自身与自身按位与结果都为自身
System.out.println(88&88); 88
2. 任何数和0按位与都是0
System.out.println(88453413&0); 0
3. 奇数和1按位与得1;偶数和1按位与得0
System.out.println(56&1); 0
System.out.println(65&1); 1
4. N&(N-1)用于消去二进制最后一个1
x = 12 二进制:1100
x-1=11 二进制:1011
x&(x-1)=8 二进制:1000 1100的第二个1内消去
5. 如果一个数N是2的n次方,N&(N-1)=0
2 --> 10 4 --> 100 8 --> 1000 16 --> 10000
因为2的n次方这个数N的二进制表示中只有一个1,所以使用N&(N-1)将唯一的一个1消去,如果N是2的幂次,那么N&(N-1)得到结果为0
System.out.println(4096&4095); 0
6. 根据4的原理,可以获取一个数的二进制有多少个1
int num=124;
int i=0;
while (num>0){
num = num&(num-1);
i++;
}
System.out.println(i);
按位或( | ) ---- 同0为0,否则为1
1. 任何数和0按位或都是自身
System.out.println(88453413|0); 88453413
按位异或( ^ ) ---- 相同为0,不同为1
1. 自身与自身按位异或结果都为0
System.out.println(5^5); 0
2. 任何数与0异或都是自身
System.out.println(88453413|0); 88453413
3. 一个数连续与另一个数异或两次,得到自身
System.out.println(88453413^5656^5656); 88453413
4. 多个数异或结果与顺序无关
System.out.println(8^9^45); 44
System.out.println(45^9^8); 44
System.out.println(8^45^9); 44
5. 根据3和4的原理,可以交换变量
a = a ^ b;
b = b ^ a; 注: b = b^a^b = b^b^a = 0^a = a 此时b已经变成了原来的a
a = a ^ b a = a^b^b^a^b = a^a^b^b^b = 0^0^b = b a变成了原b