为什么会这样:
return 1 | (1 << 32) // returns 0x00000001
但是:
return 6 | (1 << 32) // returns 0x00000007
我期待后者返回 0x00000006。什么类型的位掩码可以与表达式进行“或”运算以生成 6 | 0x00000006 (1 << 32)?
最佳答案
Java 在移位时仅使用位移参数的最后 5 位 int
s。所以1 << 32
相当于 1 << 0
,或者只是1
.
1
位已在 1
中设置,所以1 | 1
是 1
。为了清楚起见,仅显示最后 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
.
关于java - Java 中的位移位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26431832/