能否有人解释一下为什么以下位运算表达式会返回不同的结果:
System.out.println((-1<<31)<<1); // it prints 0
System.out.println(-1<<32); // it prints -1
能否有人解释一下为什么以下位运算表达式会返回不同的结果:
System.out.println((-1<<31)<<1); // it prints 0
System.out.println(-1<<32); // it prints -1
-1<<32
相当于 -1<<0
,也就是不作任何操作。原因是移位距离 (32)
会与 0x1f
进行 AND 操作,而 32 & 0x1f
的结果为0。
这在 JLS #15.19 中有定义(重点在于“我”):
如果左操作数的提升类型是 int,则 只使用右操作数的五个低位作为移位距离。这就好像将右操作数应用按位逻辑 AND 运算符 &(§15.22.1)与掩码值 0x1f(0b11111)。实际使用的移位距离因此总是在 0 到 31(含)之间。