# 源码解析

调试仓库 (opens new window)

# 算法之位运算

MDN官方运算文档 (opens new window)

# 常用符号解释

  1. “<<”运算符 “<<”运算符执行左移位运算。在移位运算过程中,符号位始终保持不变。如果右侧空出位置,则自动填充为 0;超出 32 位的值,则自动丢弃。

    把数字 5 向左移动 2 位,则返回值为 20。 console.log(5 << 2); // 返回值 20

  2. “>>”运算符 “>>”运算符执行有符号右移位运算。与左移运算操作相反,它把 32 位数字中的所有有效位整体右移,再使用符号位的值填充空位。移动过程中超出的值将被丢弃。

    把数值 1000 向右移 8 位,则返回值为 3。 纯文本复制 console.log(1000 >> 8); //返回值 3

  3. “>>>”运算符 “>>>”运算符执行无符号右移位运算。它把无符号的 32 位整数所有数位整体右移。对于无符号数或正数右移运算,无符号右移与有符号右移运算的结果是相同的。

    下面两行表达式的返回值是相同的。 console.log(1000 >> 8); //返回值 3 console.log(1000 >> 8); //返回值 3

    对于负数来说,无符号右移将使用 0 来填充所有的空位,同时会把负数作为正数来处理,所得结果会非常大所以,使用无符号右移运算符时要特别小心,避免意外错误。 console.log(-1000 >> 8); //返回值 -4 console.log(-1000 >>> 8); //返回值 16777212

# 位运算

Operator Usage Description
按位与 AND (en-US) a & b 在 a,b 的位表示中,每一个对应的位都为 1 则返回 1,否则返回 0.
按位或 OR (en-US) a b
按位异或 XOR (en-US) a ^ b 在 a,b 的位表示中,每一个对应的位,两个不相同则返回 1,相同则返回 0.
按位非 NOT (en-US) ~ a 反转被操作数的位。
左移 shift (en-US) a << b 将 a 的二进制串向左移动 b 位,右边移入 0.
算术右移 a >> b 把 a 的二进制表示向右移动 b 位,丢弃被移出的所有位。(译注:算术右移左边空出的位是根据最高位是 0 和 1 来进行填充的)
无符号右移 (左边空出位用 0 填充) a >>> b 把 a 的二进制表示向右移动 b 位,丢弃被移出的所有位,并把左边空出的位都填充为 0

# 位逻辑运算符

表达式 结果 二进制描述
15 & 9 9 1111 & 1001 = 1001
15 9 15
15 ^ 9 6 1111 ^ 1001 = 0110
~15 -16 ~ 0000 0000 … 0000 1111 = 1111 1111 … 1111 0000
~9 -10 ~ 0000 0000 … 0000 1001 = 1111 1111 … 1111 0110

# 移位运算符

运算符 描述 范例
<< (左移位) 将第一个操作数向左移动指定数量的位。左边移出位被抛弃。左边移出的几位被丢弃。右边多出的空位由 0 补齐 9<<2 产生 36,因为 1001 移位 2 比特向左变为 100100,它是 36。
>> (带符号右移) 将第一个操作数向右移动指定数量的位。右边移出位被抛弃。左边多出的空位由原值的最左边数字补齐。 9>>2 产生 2,因为 1001 移位 2 位向右变为 10,其是 2。同样,-9>>2 产生 -3,由于符号被保留。
>>> (补零右移) 将第一个操作数向右移动指定数量的位。右边移出位被抛弃。左边多出的空位由 0 补齐。 19>>>2产生 4,因为 10011 移位 2 位向右变为 100,它是 4。对非负数值,补零右移和带符号右移产生相同结果。

# 基本使用

# 位掩码:

通过位移定义的一组枚举常量, 可以利用位掩码的特性, 快速操作这些枚举产量(增加, 删除, 比较).

  1. 属性增加| ABC = A | B | C

  2. 属性删除& ~ AB = ABC & ~C

  3. 属性比较 AB 当中包含 B: AB & B === B AB 当中不包含 C: AB & C === 0 A 和 B 相等: A === B

    const A = 1 << 0; // 0b00000001
    const B = 1 << 1; // 0b00000010
    const C = 1 << 2; // 0b00000100
    
    // 增加属性
    const ABC = A | B | C; // 0b00000111
    // 删除属性
    const AB = ABC & ~C; // 0b00000011
    
    // 属性比较
    // 1. AB当中包含B
    console.log((AB & B) === B); // true
    // 2. AB当中不包含C
    console.log((AB & C) === 0); // true
    // 3. A和B相等
    console.log(A === B); // false
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
Last Updated: 3/2/2023, 3:11:52 PM