逻辑右移操作
>>>
是按位右移运算符,带有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符号扩展右移”解释更容易。
@JusticeBauer:请不要使用评论提请注意完全无关的其他问题。 – 2014-10-22 05:43:23
你有最高的选票之一,所以认为你可能有一个线索。我没有任何其他方式联系本网站的人 – 2014-10-22 11:04:14
@JusticeBauer:这并不意味着留下随机问题的评论是正确的方法去做事情。*故意*你不能要求特定的用户寻求帮助 - 相反,你写出最好的问题,并让那些愿意帮助找到它的人。 – 2014-10-22 11:45:49
这是因为binary representation的-1
是11111111111111111111111111111111
。当你对它执行一个无符号的右位移操作(>>>
)时,它将所有位向右移动参数(在这种情况下为1
)并用零填充左边的空白空间,所以你得到了01111111111111111111111111111111
这是二进制表示Integer.MAX_VALUE = 2147483647
(不知道你从哪里得到了2147483648)。
是的结果是2147483647 – 2014-10-20 14:03:50
这就是*按位*右移操作符 – Yetti99 2014-10-20 13:53:23
您的意思是说您无法得到这一行来给出您期望的结果,或者它给了您所写的结果,但您不明白为什么? – 2014-10-20 13:55:14
是的,我不明白结果 – 2014-10-20 13:57:31