2014-10-20 74 views
0

我初学java的...我已经试过很多,但找不到办法以下行逻辑右移操作

的System.out.println(-1 >>> 1);

给出2147483647?

任何人都可以帮助我吗?

+1

这就是*按位*右移操作符 – Yetti99 2014-10-20 13:53:23

+1

您的意思是说您无法得到这一行来给出您期望的结果,或者它给了您所写的结果,但您不明白为什么? – 2014-10-20 13:55:14

+0

是的,我不明白结果 – 2014-10-20 13:57:31

回答

1

>>>是按位右移运算符,带有0符号扩展 - 换句话说,从左边的“传入”的所有位填充0。

-1由32位表示,它们全部为1.当您向右移位1位且符号扩展为0时,最终的结果是31位底部位仍为1,而顶部位为0 (符号位),所以你最终得到Integer.MAX_VALUE - 这是2147483647,而不是2147483648作为你的文章状态。

还是在JLS来讲,从section 15.19

n >>>s值是n右移s位零扩展,在这里的位置:

如果n是肯定的,那么结果与n >> s相同。

如果n为负值且左侧操作数的类型为int,则结果等于表达式(n >> s) + (2 << ~s)的结果。

如果n为负值且左侧操作数的类型很长,则结果等于表达式(n >> s) + (2L << ~s)的结果。

这个定义最终会带来一点痛苦 - 使用IMO的“0符号扩展右移”解释更容易。

+0

@JusticeBauer:请不要使用评论提请注意完全无关的其他问题。 – 2014-10-22 05:43:23

+0

你有最高的选票之一,所以认为你可能有一个线索。我没有任何其他方式联系本网站的人 – 2014-10-22 11:04:14

+0

@JusticeBauer:这并不意味着留下随机问题的评论是正确的方法去做事情。*故意*你不能要求特定的用户寻求帮助 - 相反,你写出最好的问题,并让那些愿意帮助找到它的人。 – 2014-10-22 11:45:49

3

这是因为binary representation-111111111111111111111111111111111。当你对它执行一个无符号的右位移操作(>>>)时,它将所有位向右移动参数(在这种情况下为1)并用零填充左边的空白空间,所以你得到了01111111111111111111111111111111这是二进制表示Integer.MAX_VALUE = 2147483647(不知道你从哪里得到了2147483648)。

+0

是的结果是2147483647 – 2014-10-20 14:03:50