Java|Java 中的移位指令 >>> 和 >>

今天楼主看源码时看到了 Java 中的移位指令,很是困惑,于是去查阅了下资料,终于搞懂了,特此记录如下。
说明:>>> 运算符会用 0 填充高位,>> 会用符号位填充高位。
这条准则在移位正数时我们看不出他的影响,但是我们来看看负数。我举个例子, -2 >> 1 和 -2 >>> 1。

System.out.println(-2 >> 1); System.out.println(-2 >>> 1); // 分别输出下面的结果 -1 2147483647

纳尼,-2 >>> 1 右移一位成了 2147483647。
我来为你解开谜底。
首先我们来看看 -2 在计算机内如何存储。
System.out.println(Integer.toBinaryString(-2)); 输出 11111111111111111111111111111110

别害怕,这是 -2 的补码 表示,不明白的小伙伴可以自行百度一下,或者看一下微机原理的书。
我们再回顾一下:>>> 运算符会用 0 填充高位,>> 会用符号位填充高位。
  1. 好,下面我们来看,>>> 情况下右移一位,用 0 补充高位则是
System.out.println(Integer.toBinaryString(-2>>> 1)); 01111111111111111111111111111111

// 这是补码的表示,我们得到他的真值为 1111111111111111111111111111111,化为十进制为 2 ** 31 -1(等比数列求和公式啊,不懂得小伙伴回去看看数学书),即 2147483647。
  1. 那么很简单了啊,我们再来看 -2 >> 1,用符号位补充高位,负号符号位为 -1,
System.out.println(Integer.toBinaryString(-2>> 1 )); 11111111111111111111111111111111

11111111111111111111111111111111 这也是补码的表示,我们对他 在取补码 + 1 得到 他的真值为 10000000000000000000000000000001,即是 -1。
总结一下,右移的数为正数时, >> 和 >>> 没有区别,因为正数的符号位为 0 ,右移的数为负数时,>> 和 >>> 有所区别,要加以区分。
【Java|Java 中的移位指令 >>> 和 >>】参考资料:
Difference between >> and >>>
Bitwise and Bit Shift Operators

    推荐阅读