位运算符

注:如果得出的结果为负数,需要取负数的补码。

取补码的过程为对负数除了符号位进行取反,再加1。

负数按补码形式参加按位与运算

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 0000
1000 0101 0000   -80

 

posted @ 2016-11-25 17:53  喝酒骑驴撞城管  阅读(180)  评论(0编辑  收藏  举报