为什么Java中的表达式(-1 >>> 32)
按预期评估为-1
而不是0
? >>>
- 移位运算符应填充前面的0,因此结果应将所有位设置为0。
这很奇怪,因为它打破了>>>
的语义:例如对于所有(-1 >>> x)
,0 <= x <= 31
将前x位设置为0。唯一(意外)异常是32。
这是故意行为,错误还是(过度动态)编译器优化?
我使用表达式~(-1 >>> x)
将cidr-netmask扩展为32位等效,但看起来,/ 32-mask必须单独处理。
答案 0 :(得分:1)
检查this post。
引用答案作者Rasmus Faber
来自Java语言规范:
如果左侧操作数的提升类型是int,则只有五个 右侧操作数的最低位用作移位 距离。好像右手操作数受到了a 按位逻辑AND运算符&amp; (§15.22.1),掩码值为0x1f。 因此,实际使用的移位距离始终在0到0的范围内 31,包容性。
简而言之:由于操作数范围限制,-1 >>> 32
相当于-1 >>> 0
-1
。