注:若是得出的结果为负数,须要取负数的补码。java
取补码的过程为对负数除了符号位进行取反,再加1。spa
5&-3=5
-3====10000011
-3反码11111100
-3补码11111101
5==00000101
5&-3==00000101=5二进制
5|-3=-3
-3====10000011
-3反码11111100
-3补码11111101
5==00000101
5|-3==11111101结果为负数求补码
先反码10000010
再补码10000011=-3位运算
15^-2=-15
-2=10000010
先反码11111101
再补码11111110
15=00001111
15^-2=11110001
先反码10001110
再补码10001111
15^-2=-15运算符
~2=-3
2=00000010
~2=11111101
先反码10000010
再补码10000011=-3
~-2=1
-2=10000010
先反码11111101
再补码11111110
~-2=00000001=1
java中有三种移位运算符
>>表示右移,若是该数为正,则高位补0,若为负数,则高位补1(所有补1);
>>>表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位一样补0。
1)res = 20 >> 2;
20的二进制为 0001 0100,右移2位后为 0000 0101,则结果就为 res = 5;
2)res = -20 >> 2;
-20 == 1001 0100
补码==1110 1100
右移2位后为 11111011
补码==10000101 结果为 res = -5;
3)而对于>>>符号而言:
res = 20 >>> 2; 的结果与 >> 相同;
4)res = -20 >> 2;???
-20的二进制为 1110 1011,右移2位,此时高位补0,即 0011 1010,结果为 res = 1073741819;
5)res = 20 << 2;
20== 0001 0100
01010000 = 80
6)res = -20 << 2;
结果为 res = -80;
1000 0001 0100 -20
1111 1110 1100 -20补码
1111 1011 00001000 0101 0000 -80