返回首页

弄清楚什么是位运算

布莱克2026-01-17 22:39
Tip:文章封面与内容无关,作者旅游时拍摄,因为没什么值得把四季都错过!

位运算基础:

位运算都是针对 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ⁿ)

assistant