java二进制数原码补码反码,运算符 与(&)、非(~)、或(|)、异或(^)及位运算总结

    看过博主另一篇文章--Java集合--HashMap,对里面使用的运算符及位运算不是很清楚的童鞋可以看下这篇文章,对理解hashMao源码很有帮助,自己也可以在程序中写写,逼格绝对满分!!!

     大家都知道一个字节是8个二进制数,一个int是四个字节,所以一个int数据为32个二进制数(原码),本文所有运算都是基于二进制,十进制转二进制不清楚的可以自行百度,废话不多说,我们一个个来看:

一:二进制数源码补码反码分析

(1)原码

原码上面有提到过,既转化为二进制数,空位补0,补齐32位,如10的原码为:

0000 0000 0000 0000 0000 0000 0000 1010

负数的话取绝对值转化为原码,最高位补1,所以最高位也称为符号位,为1的话改数位负数,0的话为正数,所以-10的原码为

1000 0000 0000 0000 0000 0000 0000 1010

(2)反码

正数的反码跟原码相同,负数的反码为除符号位外全部取反,所以-10的反码就为

1111 1111 1111 1111 1111 1111 1111 0101

(3)补码

正数的补码与原码相同,负数的话为原码除符号位外全部取反,然后+1,所以-10的补码为:

1111 1111 1111 1111 1111 1111 1111 0101 +1 = 

1111 1111 1111 1111 1111 1111 1111 0110

二:运算符

(1)与(&)

计算10&2时将10、2转换为二进制数为:

0000 0000 0000 0000 0000 0000 0000 1010

0000 0000 0000 0000 0000 0000 0000 0010       &运算符表示,比较同位置的数,都为1则为1,否则都为0,所以运算结果为:

0000 0000 0000 0000 0000 0000 0000 0010 = 2

(2)或(|)

计算10|2时将10、2转换为二进制数为:

0000 0000 0000 0000 0000 0000 0000 1010

0000 0000 0000 0000 0000 0000 0000 0010       |运算符表示,比较同位置的数,有一个为1就为1,所以运算结果为:

0000 0000 0000 0000 0000 0000 0000 1010 = 10

(3)异或(^)

计算10^2时将10、2转换为二进制数为:

0000 0000 0000 0000 0000 0000 0000 1010

0000 0000 0000 0000 0000 0000 0000 0010       ^运算符表示,比较同位置的数,相同则为0,不同则为1,所以运算结果为:

0000 0000 0000 0000 0000 0000 0000 1000 = 8

(4)非(~)

非运算符算起来比较麻烦,总结之后其实就是,你对一个数x进行非操作既~x,得到的值为-(x+1),~~x为-(-(x+1)+1)。

三:移位运算

(1)>>右移位运算符

拿10举例子,10的二进制为:

0000 0000 0000 0000 0000 0000 0000 1010   10>>2右移两位为

    00 0000 0000 0000 0000 0000 0000 0010   缺少的高位补0所以完整结果为

0000 0000 0000 0000 0000 0000 0000 0010 = 2  相当于10/2^2

如果为-10,则计算方法不同先取-10的补码

1111 1111 1111 1111 1111 1111 1111 0110 右移两位

    11 1111 1111 1111 1111 1111 1111 1101然后高位补符号位,负数的符号位为1,所以为

1111 1111 1111 1111 1111 1111 1111 1101 然后取原码,-1后取反,结果为

1000 0000 0000 0000 0000 0000 0000 0011 = -3

(2)<<左移位运算符

拿10举例子,10的二进制为:

0000 0000 0000 0000 0000 0000 0000 1010   10<<2左移两位为

0000 0000 0000 0000 0000 0000 0010 10        缺少的低位补0所以完整结果为

0000 0000 0000 0000 0000 0000 0010 1000 = 40 相当于10*2*2

负数的话,加上-就行,计算方法与右移位运算符一样

(3)无符号右移位运算符>>>

拿10举例子,10的二进制为:

0000 0000 0000 0000 0000 0000 0000 1010      取补码为

0000 0000 0000 0000 0000 0000 0000 1010      10>>>2 右移二位,高位补0

0000 0000 0000 0000 0000 0000 0000 0010      所以结果为2

-10的话取补码为:

1111 1111 1111 1111 1111 1111 1111 0110            -10>>>2 右移二位,高位补0

0011 1111 1111 1111 1111 1111 1111 1101           所以结果为1073741821

无符号位的意思是移动后不补符号位,既将符号位当成数字,有意思的是-1>>>1能得到Integer.MAX_VALUE。

总结位运算符号就是将int类型的数转化为二进制补码,然后移位,有符号位移,需将移位后的二进制转化为原码,无符号位移则不需要。

猜你喜欢

转载自blog.csdn.net/weixin_36507118/article/details/82986377