在看jdk源码的时候,经常在源码中看到位移操作符,但是我个人几乎没有在项目中使用过。为什么不用?只有一个原因:“不会”。 使用一项技术,不管是开源框架,还是第三方工具,首先要理解该技术本身,其次要理解应用场景。 我们开始学习理解位移: ">>" (位移)和 ">>>" (无符号位移) ">>" n 向右位移n位:右移之后,左侧空出来的位置,以符号位补充。 ">>>" n 向右位移n位:右移之后,左侧空出来的位置,以 0 补充。 因为Java中的移位操作只对int和long有效,对byte、short、char进行位移操作,都是先转化为int后再进行移位, 举例:
1、右移操作(对空位补充符号位 )
-10 ">>" 1 值为 -5,(数值在计算过程中都是使用补码操作)。
-10的原码:1000 0000 0000 0000 0000 0000 0000 1010
-10的反码:1111 1111 1111 1111 1111 1111 1111 0101 (负数的反码是原码的符号位不变,其他取反)
-10的补码 : 1111 1111 1111 1111 1111 1111 1111 0110 (负数的补码是其反码+1)
-10">>"1 : 1111 1111 1111 1111 1111 1111 1111 0110
右移1位--> 1111 1111 1111 1111 1111 1111 1111 1011 (符号位为1,表示负数)
原码: 1000 0000 0000 0000 0000 0000 0000 0101 = -5
2、无符号右移(对空位补充 0 )
-10">>>"1: 1111 1111 1111 1111 1111 1111 1111 0110 (补码)
无符号右移1位:0111 1111 1111 1111 1111 1111 1111 1011 = 2147483643 (正数,直接求得结果)