从原理上讲,位逻辑操作符的工作流程是这样的:
- 将操作数转换为 32 位的整型数值并用二进制表示。
- 第一操作数的每一位与第二操作数的对应位配对:第一位对第一位,第二位对第二位,以此类推。
- 对每一对位应用操作符,最终结果按位组合起来。
- 15 & 9 结果为 9 (1111 & 1001 = 1001)
- 15 | 9 为 15 (1111 | 1001 = 1111)
- 15 ^ 9 为 6 (1111 ^ 1001 = 0110)
移位操作符
移位操作符需要两个操作数:第一个是要进行移位的数值,第二个指定要对第一个数移位的数目。移位的方向由使用的操作符决定。
移位操作符将把两个操作符转换为 32 位整型数值,并返回与左操作数类型相同的结果。
<< (左移)
该操作符将把第一个操作数向左移若干位。移出的位将被忽略。右侧空位补零。
例如,9<<2 结果为 36,因为 1001 向左移两位变成 100100,这是 36。
>> (算术右移)
该操作符将把第一个操作数享有移若干位。移出的位将被忽略。左侧的空位补上与原来最左面位相同的值。
例如,9>>2 结果为 2,因为 1001 右移两位变成 10,这是 2。反之,-9>>2 结果为 -3,因为要考虑到符号位。
>>> (逻辑右移)
该操作符将把第一个操作数享有移若干位。移出的位将被忽略。左侧的空位补零。
例如,19>>>2 结果为 4,因为 10011 右移两位变成 100,这是 4。对于非负数,算术右移和逻辑右移结果相同。
| 操作符 | 用法 | 描述 |
|---|---|---|
| 按位与 | a & b | 如果两个操作数对应位都是 1 的话则在该位返回 1。 |
| 按位或 | a | b | 如果两个操作数对应位都是 0 的话则在该位返回 0。 |
| 按位异或 | a ^ b | 如果两个操作数对应位只有一个 1 的话则在该位返回 1。 |
| 求反 | ~ a | 反转操作数的每一位。 |
| 左移 | a << b | 将 a 的二进制形式左移 b 位。右面的空位补零。 |
| 算术右移 | a >> b | 将 a 的二进制形式右移 b 位。忽略被移出的位。 |
| 逻辑右移 | a >>> b | 将 a 的二进制形式右移 b 位。忽略被移出的位,左侧补入 0。 |
