概述
计算机是以二进制的补码来运算的
原码
符号位加上数字的二进制表示。二进制中最高位“0”表示正数(+),“1”表示负数(-)
反码
正数的反码和原码一样。负数的反码,除了符号位,其他的位数全部取反
补码
正数的补码和原码一样。负数的补码为反码 + 1
运算符
&:与运算(有0则0)
|:或运算(有1则1)
^:异或运算(相同则0,不同则1)
~:取反运算(0变1,1变0)
<<:左移(左边最高位丢弃,右边补齐0)
>>:右移(最高位是0,左边补齐0;最高为是1,左边补齐1)
>>>:无符号右移(无论最高位是0还是1,左边补齐0)
与运算
00000000 00000000 00000000 00000011
& 00000000 00000000 00000000 00000100
-----------------------------------
00000000 00000000 00000000 00000000
结果是:0
或运算
00000000 00000000 00000000 00000011
| 00000000 00000000 00000000 00000100
-----------------------------------
00000000 00000000 00000000 00000111
结果是:7
异或运算
00000000 00000000 00000000 00000011
& 00000000 00000000 00000000 00000100
-----------------------------------
00000000 00000000 00000000 00000111
结果是:7
特点:一个数据对另一个数据位异或两次,该数本身不变
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println(a ^ b ^ b); //10
System.out.println(a ^ b ^ a); //20
}
基于该特点可以做整数的交换,无需中间变量,数据也不会溢出整数范围,而且效率最快
public static void main(String[] args) {
int a = 10;
int b = 20;
a = a ^ b;
b = a ^ b;
a = a ^ b;
System.out.println(a); //20
System.out.println(b); //10
}
取反运算
00000000 00000000 00000000 00000011
~ 11111111 11111111 11111111 11111100 (补码)
补码:11111111 11111111 11111111 11111100
反码:11111111 11111111 11111111 11111011
原码:10000000 00000000 00000000 00000100
结果是:-4
左移 右移 无符号右移
public static void main(String[] args) {
//<< 把<<左边的数据乘以2的移动次幂
System.out.println(3 << 2); //3*2^2 = 3*4 = 12;
//>> 把>>左边的数据除以2的移动次幂
System.out.println(24 >> 2); //24 / 2^2 = 24 / 4 = 6
System.out.println(24 >>> 2);
System.out.println(-24 >> 2);
System.out.println(-24 >>> 2);
}
/*解析:
3 << 2:
3的二进制: 00000000 00000000 00000000 00000011
左移后: (00)000000 00000000 00000000 0000001100
-24 >> 2:
24的二进制:11000
原码: 10000000 00000000 00000000 00011000
反码: 11111111 11111111 11111111 11100111
补码: 11111111 11111111 11111111 11101000
右移后:1111111111 11111111 11111111 111010(00) 补码
补码:1111111111 11111111 11111111 111010
反码:1111111111 11111111 11111111 111001
原码:1000000000 00000000 00000000 000110
结果:-6
-24 >>> 2:
24的二进制:11000
原码:10000000 00000000 00000000 00011000
反码:11111111 11111111 11111111 11100111
补码:11111111 11111111 11111111 11101000
右移后:0011111111 11111111 11111111 111010(00)
结果:...
*/