# 源码解析
# 算法之位运算
# 常用符号解释
“<<”运算符 “<<”运算符执行左移位运算。在移位运算过程中,符号位始终保持不变。如果右侧空出位置,则自动填充为 0;超出 32 位的值,则自动丢弃。
把数字 5 向左移动 2 位,则返回值为 20。 console.log(5 << 2); // 返回值 20
“>>”运算符 “>>”运算符执行有符号右移位运算。与左移运算操作相反,它把 32 位数字中的所有有效位整体右移,再使用符号位的值填充空位。移动过程中超出的值将被丢弃。
把数值 1000 向右移 8 位,则返回值为 3。 纯文本复制 console.log(1000 >> 8); //返回值 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。对非负数值,补零右移和带符号右移产生相同结果。 |
# 基本使用
# 位掩码:
通过位移定义的一组枚举常量, 可以利用位掩码的特性, 快速操作这些枚举产量(增加, 删除, 比较).
属性增加| ABC = A | B | C
属性删除& ~ AB = ABC & ~C
属性比较 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
事件机制 →