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。
2. 那么很简单了啊,我们再来看 -2 >> 1,用符号位补充高位,负号符号位为 -1,

System.out.println(Integer.toBinaryString(-2>> 1 ));
11111111111111111111111111111111

11111111111111111111111111111111 这也是补码的表示,我们对他 在取补码 + 1 得到 他的真值为 10000000000000000000000000000001,即是 -1。

总结一下,右移的数为正数时, >> 和 >>> 没有区别,因为正数的符号位为 0 ,右移的数为负数时,>> 和 >>> 有所区别,要加以区分。

参考资料:
Difference between >> and >>>
Bitwise and Bit Shift Operators

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值