位运算符

注:若是得出的结果为负数,须要取负数的补码。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位运算

负数按补码形式参加异或运算:^ 相同返回0,不一样返回1

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

相关文章
相关标签/搜索