位运算都是针对 32 位有符号整数(二进制)进行的。运算前会先将数值转换为 32 位整数,运算后再转换回 JavaScript 数值
32位整数表示:
// 正数 5 的二进制表示(32位)
00000000 00000000 00000000 00000101
// 负数 -5 的二进制表示(使用补码)
// 1. 正数 5 的二进制:0000...0101
// 2. 按位取反:1111...1010
// 3. 加 1:1111...1011规则:两位都为1时结果为1,否则为0
5 & 3 = 1
二进制分析:
5 = 0101
3 = 0011
-------- &
0001 = 1实用场景:
// 1. 判断奇偶性(比 % 2 更快)
function isOdd(n) {
return (n & 1) === 1;
}
console.log(isOdd(5)); // true
console.log(isOdd(4)); // false规则:至少一位为 1 时结果为 1
5 | 3 = 7
二进制分析:
5 = 0101
3 = 0011
-------- |
0111 = 7实用场景:
// 向下取整
function floor(n) {
return n | 0;
}
console.log(floor(3.14)); // 3
console.log(floor(-3.14)); // -3(注意:负数也是向下取整)规则:两位不同时结果为1
5 ^ 3 = 6
二进制分析:
5 = 0101
3 = 0011
-------- ^
0110 = 6实用场景:
// 交换变量值
let a = 5, b = 3;
a ^= b; // a = 6
b ^= a; // b = 5
a ^= b; // a = 3规则:将所有位向左移动,右侧补0
5 << 1 = 10
5 << 2 = 20
二进制分析:
5 = 101
5 << 1 = 1010 = 10(相当于 ×2)
5 << 2 = 10100 = 20(相当于 ×4)数学等价:x << n = x × 2ⁿ
console.log(5 << 1); // 10 (5 × 2¹)
console.log(5 << 2); // 20 (5 × 2²)
console.log(5 << 3); // 40 (5 × 2³)规则:向右移动,左侧用符号位填充(保持符号)
-5 >> 1 = -3
5 >> 1 = 2
二进制分析:
5 = 0101
5 >> 1 = 0010 = 2(相当于 ÷2 向下取整)
-5 = 1111...1011
-5 >> 1 = 1111...1101 = -3(保持负数)数学等价:x >> n = Math.floor(x / 2ⁿ)
