Java中的位移

syk*_*ker 0 java bit-manipulation

为什么:

return 1 | (1 << 32) // returns 0x00000001
Run Code Online (Sandbox Code Playgroud)

但:

return 6 | (1 << 32) // returns 0x00000007
Run Code Online (Sandbox Code Playgroud)

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

rge*_*man 5

当移位ints 时,Java仅使用位移参数的最后5位.所以1 << 32相当于1 << 0,或者只是1.

1位已经设置1,所以1 | 11.为清晰起见,仅显示最后8位:

   0000 0001 (1)
or 0000 0001 (1)
------------
   0000 0001 (1)
Run Code Online (Sandbox Code Playgroud)

但该1位未设置6,因此6 | 1设置该位并且数字变为7.它按预期工作.

   0000 0110 (6)
or 0000 0001 (1)
------------
   0000 0111 (7)
Run Code Online (Sandbox Code Playgroud)

加成

针对问题的补充:

6只有2位set(0000 0110),所以任何你可以按位或者6仍然具有的数字6必须清除明确的所有位6.只留下4个选项,即6设置或清除的设置位的组合:

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

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