Java语言规范中的Bitshift运算符描述

时间:2017-07-13 08:42:23

标签: java bit-shift jls

§JLS-15.19

的JLS8中指定
  

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

我不清楚这句话的粗体。非常感谢一个例子。

1 个答案:

答案 0 :(得分:7)

这是Java利用来自C和C ++世界的编译器优化。对于32位int,使用大于或等于31的位移参数将结果值设置为0,表示正int。 (对于否定参数,C和C ++中的移位行为是实现定义)。

在C和C ++中,对于32位int实际上使用大于31的值实际上是未定义的行为,Java身体实际上已经明确地定义了行为并且只是执行模数为32的转换(这是大多数C和C ++编译器实际上做的)。您引用的JLS代码段中明确提到了此方法。

提取数字的最低五位相当于将该数字取模32。