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)?
当移位ints 时,Java仅使用位移参数的最后5位.所以1 << 32相当于1 << 0,或者只是1.
该1位已经设置1,所以1 | 1是1.为清晰起见,仅显示最后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设置或清除的设置位的组合:
任何其他任何int会设置至少另一个位,使输出不是6.