# JS 中的位运算
按位操作符 (opens new window) 将其操作数(operands)当作 32 位的比特序列(由 0 和 1 组成),而不是十进制、十六进制或八进制数值。例如,十进制数 9,用二进制表示则为 1001。按位操作符操作数字的二进制形式,但是返回值依然是标准的 JavaScript 数值。
运算符 | 用法 | 描述 |
---|---|---|
按位与( AND) | a & b | 对于每一个比特位,只有两个操作数相应的比特位都是 1 时,结果才为 1,否则为 0。 |
按位或(OR) | a | b | 对于每一个比特位,当两个操作数相应的比特位至少有一个 1 时,结果为 1,否则为 0。 |
按位异或(XOR) | a ^ b | 对于每一个比特位,当两个操作数相应的比特位有且只有一个 1 时,结果为 1,否则为 0。 |
按位非(NOT) | ~ a | 反转操作数的比特位,即 0 变成 1,1 变成 0。 |
左移(Left shift) | a << b | 将 a 的二进制形式向左移 b (<32) 比特位,右边用 0 填充。 |
有符号右移 | a >> b | 将 a 的二进制表示向右移 b (<32) 位,丢弃被移出的位。 |
无符号右移 | a >>> b | 将 a 的二进制表示向右移 b (<32) 位,丢弃被移出的位,并使用 0 在左侧填充。 |
# 判断奇偶性
在 平方求幂 中,我们说过可以使用 &
运算符来判断一个数是奇数还是偶数
偶数 & 1 会得到 0 ,奇数 & 1 会得到 1
1 & 1 // 0001 & 0001 => 0001 => 1
2 & 1 // 0010 & 0001 => 0000 => 0
# 使用 ~, >>, <<, >>>, |,^, & 来取整
~~8.33 // 8
8.33 >> 0 // 8
8.33 << 0 // 8
8.33 | 0 // 8
8.33 >>> 0 // 8
-8.33 >>> 0 // 4294967288
8.33 ^ 0 // 8
8.33 & -1 // 8
-1 对应的机器数是 32 个 1 ,所以,与 -1 与的位操作运算导致了 操作数 去掉了小数部分,而且不会改变操作数的整数部分的值
>>>
不可对负数取整
同一个数两次异或 也可以达到取整的效果
8.33 ^ 3 ^ 3 // 8
# 计算 2的幂
使用左移运算符可以快速计算出 2的幂
1 << 2 // 1 * 2 ^ 2 => 4
1 << 3 // 1 * 2 ^ 3 => 8
对于 二进制的 移位操作,每向左移一位,就相当于乘了 基数,即 2 ,左移 n 位,就相当于 乘了 n 次 基数,即 基数的 n 次方,也即 2 的 n 次方,所以, 一个数 左移 n 位,就相当于 乘了 2 的 n 次方
# 使用 ^ 交换值
let a = 3
let b = 5
a ^= b
b ^= a
a ^= b
使用 ES6 结构赋值也可以
let a = 3
let b = 5
[b, a] = [a, b]
# 使用 ^ 判断是否相等
let a = 3
a ^ 3 // 0
a ^ 4 // 7
如果相等会返回 0, 否则为其他数
# 使用 ^ 切换变量 0 或 1
t ^= 1
当 t 为 0 时,得到结果为 1, 当 t 为 1 时,得到结果为 0