# 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