(-1>>> 32)== -1?

时间:2013-07-26 09:24:09

标签: java expression operator-keyword bit-shift shift

为什么Java中的表达式(-1 >>> 32)按预期评估为-1而不是0>>> - 移位运算符应填充前面的0,因此结果应将所有位设置为0。

这很奇怪,因为它打破了>>>的语义:例如对于所有(-1 >>> x)0 <= x <= 31将前x位设置为0。唯一(意外)异常是32。

这是故意行为,错误还是(过度动态)编译器优化?

我使用表达式~(-1 >>> x)将cidr-netmask扩展为32位等效,但看起来,/ 32-mask必须单独处理。

1 个答案:

答案 0 :(得分:1)

检查this post

引用答案作者Rasmus Faber

  

来自Java语言规范:

     
    

如果左侧操作数的提升类型是int,则只有五个     右侧操作数的最低位用作移位     距离。好像右手操作数受到了a     按位逻辑AND运算符&amp; (§15.22.1),掩码值为0x1f。     因此,实际使用的移位距离始终在0到0的范围内     31,包容性。

  

简而言之:由于操作数范围限制,-1 >>> 32相当于-1 >>> 0 -1