对于以下程序:
public class ZeroFillRightShift { public static void main(String args[]) { int x = -1; int y = x>>>1; System.out.println("x = " + x); System.out.println("y = " + y); } }@H_301_4@我得到的输出如下:
x = -1 y = 2147483647@H_301_4@我得到-1>>> 1的结果是2147483647.如果这是符号位必须被移位,据我所知,结果应该是1073741824.为什么是2147483647呢? @H_301_4@以下图像更清楚地说明了我的问题:
解决方法
@H_301_4@The unsigned right shift operator “>>>” shifts a zero into the@H_301_4@所以,-1以零扩展向右移位一位,这意味着它会将0插入最左边的位置.记住,我们在这里处理two’s complement: @H_301_4@-1为:11111111111111111111111111111111或十六进制0xFFFFFFFF @H_301_4@-1>>> 1是十六进制中的01111111111111111111111111111111或0x7FFFFFFF,它是231 – 1 == 2147483647 @H_301_4@以下是shift operators的JLS参考. @H_301_4@你似乎对两个人的补充感到困惑.该值用于31位,并且最左边的位用于符号.由于你只是移位1位,有符号位变为0,这意味着正数,结果是最大的正数,而不是int可以表示. @H_301_4@也许另一个例子会有所帮助.我们来考虑一下:
leftmost position,while the leftmost position after “>>” depends on
sign extension.
System.out.println(-2 >> 1); //prints -1@H_301_4@-2 = 1111111111111111111111111111111110 @H_301_4@如果我们使用已签名的右移,我们得到:11111111111111111111111111111111,这是-1.但是,如果我们这样做:
System.out.println(-2 >>> 1); //prints 2147483647@H_301_4@由于-2 = 11111111111111111111111111111110并进行无符号右移,这意味着我们以零扩展方式移位1位,给出:011111111111111111111111111111