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 填充高位,>> 会用符号位填充高位。
- 好,下面我们来看,>>> 情况下右移一位,用 0 补充高位则是
System.out.println(Integer.toBinaryString(-2>>> 1));
01111111111111111111111111111111
// 这是补码的表示,我们得到他的真值为 1111111111111111111111111111111,化为十进制为 2 ** 31 -1(等比数列求和公式啊,不懂得小伙伴回去看看数学书),即 2147483647。
- 那么很简单了啊,我们再来看 -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
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- JS中的各种宽高度定义及其应用
- 我眼中的佛系经纪人
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- Android中的AES加密-下
- 事件代理
- 放下心中的偶像包袱吧
- C语言字符函数中的isalnum()和iscntrl()你都知道吗
- Java|Java OpenCV图像处理之SIFT角点检测详解