Java中的位移

时间:2014-10-17 19:10:03

标签: java bit-manipulation

为什么会这样:

return 1 | (1 << 32) // returns 0x00000001

但:

return 6 | (1 << 32) // returns 0x00000007

我期待后者返回0x00000006。可以使用表达式对哪种类型的位掩码进行OR运算,以便为6 |生成0x00000006 (1 <&lt; 32)?

1 个答案:

答案 0 :(得分:5)

Java仅在移位int时使用位移参数的最后5位。因此1 << 32相当于1 << 0,或仅1

1位已在1中设置,因此1 | 11。为清晰起见,仅显示最后8位:

   0000 0001 (1)
or 0000 0001 (1)
------------
   0000 0001 (1)

1位未在6中设置,因此6 | 1设置位,数字变为7。它按预期工作。

   0000 0110 (6)
or 0000 0001 (1)
------------
   0000 0111 (7)

<强>加成

回答问题的补充:

6只设置了2位(0000 0110),因此任何可以与6进行按位或仍然具有6的数字必须清除所有位6清楚明了。只剩下4个选项,6的设置位组合被设置或清除:

  • 0(0000 0000)
  • 2(0000 0010)
  • 4(0000 0100)
  • 6(0000 0110)

任何其他int将至少设置另一位,使输出不是6