Java 位运算符 <<

13

能否有人解释一下为什么以下位运算表达式会返回不同的结果:

System.out.println((-1<<31)<<1);   // it prints 0
System.out.println(-1<<32);        // it prints -1

1
还有 https://dev59.com/BlsX5IYBdhLWcg3wJMnb 和 https://dev59.com/JHA75IYBdhLWcg3wqLD_。 - Tunaki
@Tunaki:是的,它很相似。 - nenito
2个回答

14

-1<<32 相当于 -1<<0,也就是不作任何操作。原因是移位距离 (32) 会与 0x1f 进行 AND 操作,而 32 & 0x1f 的结果为0。

这在 JLS #15.19 中有定义(重点在于“我”):

如果左操作数的提升类型是 int,则 只使用右操作数的五个低位作为移位距离。这就好像将右操作数应用按位逻辑 AND 运算符 &(§15.22.1)与掩码值 0x1f(0b11111)。实际使用的移位距离因此总是在 0 到 31(含)之间。


3
移位计数值对32取模。因此,第二个示例实际上与移位0相同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接