java中的逻辑右移运算符

时间:2014-10-20 13:50:42

标签: java

我是java的初学者...我已经尝试了很多但是找不到以下行的方式

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

给出2147483647?

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:3)

这是因为-1的{​​{3}}是11111111111111111111111111111111。当你在它上面执行无符号右移位操作(>>>)时,它会将所有位移动到参数(在这种情况下为1)并用零填充左边的空白区域你得到01111111111111111111111111111111这是Integer.MAX_VALUE = 2147483647的二进制表示(不知道你从哪里获得2147483648)。

答案 1 :(得分: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为负数且左侧操作数的类型为long,则结果等于表达式(n >> s) + (2L << ~s)的结果。

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