Java按位运算符<<

时间:2016-03-30 09:38:27

标签: java bit-manipulation bit-shift

有人可以解释为什么以下按位表达式会返回不同的结果:

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

2 个答案:

答案 0 :(得分:14)

-1<<32相当于-1<<0,即无操作。原因是移位距离(32)0x1f进行了对比,32 & 0x1f为0。

这是在JLS #15.19(强调我的)中定义的:

  

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

答案 1 :(得分:3)

移位计数值以模32使用。因此第二个例子实际上与移位0相同。