一文搞明白位运算、补码、反码、原码 (2)

我们再来看-2 << 1与-2 >> 1。
-2用原码表示为10000000 00000000 00000000 00000010
-2用反码表示为11111111 11111111 11111111 11111101
-2用补码表示为11111111 11111111 11111111 11111110
-2 << 1,表示-2的补码左移一位后为11111111 11111111 11111111 11111100,该补码对应的反码为  

11111111 11111111 11111111 11111100 - 1 = 11111111 11111111 11111111 11111011

该反码对应的原码为:符号位不变,其他位取反,为10000000 00000000 00000000 00000100,表示-4。
所以-2 << 1 = -4。

同理-2 >> 1是一样的计算方法,这里就不演示了。

无符号右移

上面在进行左移和右移时,我有一点没讲到,就是在对补码进行移动时,符号位是固定不动的,而无符号右移是指在进行移动时,符号位也会跟着一起移动
比如-2 >>> 1。

-2用原码表示为10000000 00000000 00000000 00000010
-2用反码表示为11111111 11111111 11111111 11111101
-2用补码表示为11111111 11111111 11111111 11111110

-2的补码右移1位为:01111111 11111111 11111111 11111111
右移后的补码对应的反码、原码为:01111111 11111111 11111111 11111111 (因为现在的符号位为0,表示正数,正数的原、反、补码都相同)
所以,对应的十进制为2147483647。
也就是-2 >>> 1 = 2147483647

总结

文章写的可能比较乱,希望大家能看懂,能有所收获。这里总结一下,我们可以发现:
2 << 1 = 4 = 22
2 << 2 = 8 = 222
2 << n = 22
m << n = m * 2
右移则相反,所以大家以后在源码中再看到位运算时,可以参考上面的公式。

如果想第一时间学习更多的精彩的内容,请关注微信公众号:1点25

reny125.jpeg

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpsjzp.html