深入浅出 - 按位操作符

JS按位操作符

前置概念

比特位: 比特位即Bit,是计算机最小的存储单位。以0或1来表示比特位的值。

JS按位操作符:操作32位比特序列(二进制)

最值

  • 数字-2147483648 和 2147483647 是32位有符号数字所能表示的最小和最大整数

0 (base 10) = 00000000000000000000000000000000 (base 2)

-1 (base 10) = 11111111111111111111111111111111 (base 2)

-2147483648 (base 10) = 10000000000000000000000000000000 (base 2)

2147483647 (base 10) = 01111111111111111111111111111111 (base 2)

按位操作符表

运算符 用法 描述
按位与(AND) a & b 对于每一个比特位,只有两个操作数相应的比特位都是1时,结果才为1,否则为0;
按位或(OR) a 丨 b 对于每一个比特位,当两个操作数相应的比特位至少有一个1时,结果为1,否则为0;
按位异或(XOR) a ^ b 对于每一个比特位,当两个操作数相应的比特位有且只有一个1时,结果为1,否则为0;
按位非(NOT) ~ a 反转操作数的比特位,即0变成1,1变成0;
有符号左移 a << b 将 a 的二进制形式向左移 b (< 32) 比特位,右边用0填充;
有符号右移 a >> b 将 a 的二进制表示向右移 b (< 32) 位,丢弃被移出的位,并使用最左侧的位以填充左侧。
无符号右移 a >>> b 将 a 的二进制表示向右移 b (< 32) 位,丢弃被移出的位,并使用 0 以填充左侧;

按位与(AND)- a & b

  • 对于每一个比特位,只有两个操作数相应的比特位都是1时,结果才为1,否则为0;

  • 案例 14 & 13 -> 12

14 (base 10) = 00000000000000000000000000001110 (base 2)
13 (base 10) = 00000000000000000000000000001101 (base 2)
--------------------------------------------------------
12 (base 10) = 00000000000000000000000000001100 (base 2)

按位或(OR)- a | b

  • 对于每一个比特位,当两个操作数相应的比特位至少有一个1时,结果为1,否则为0;

  • 案例 14 | 13 -> 15

14 (base 10) = 00000000000000000000000000001110 (base 2)
13 (base 10) = 00000000000000000000000000001101 (base 2)
--------------------------------------------------------
15 (base 10) = 00000000000000000000000000001111 (base 2)

按位异或(XOR)- a ^ b

  • 对于每一个比特位,当两个操作数相应的比特位有且只有一个1时,结果为1,否则为0;

  • 案例 14 ^ 13 -> 3

14 (base 10) = 00000000000000000000000000001110 (base 2)
13 (base 10) = 00000000000000000000000000001101 (base 2)
--------------------------------------------------------
3  (base 10) = 00000000000000000000000000000011 (base 2)

按位非(NOT)- ~ a

  • 反转操作数的比特位,即0变成1,1变成0;

  • 案例 ~14 -> -15

14 (base 10) = 00000000000000000000000000001110 (base 2)
--------------------------------------------------------
-15(base 10) = 11111111111111111111111111110001 (base 2)

备注:默认 -1 (base 10) = 11111111111111111111111111111111 (base 2)

  • 使用场景

    一:判断是否存在某值 ~'test'.indexOf(1) -> 0, -1直接转化为0

二:为字符串转数字~~'123' -> 123

有符号左移 - a << b

  • 将 a 的二进制形式向左移 b (< 32) 比特位,右边用0填充;

  • 案例 14 << 2 -> 56

14 (base 10) = 00000000000000000000000000001110 (base 2)
--------------------------------------------------------
56 (base 10) = 00000000000000000000000000111000 (base 2)

有符号右移 - a >> b

  • 将 a 的二进制表示向右移 b (< 32) 位,丢弃被移出的位,并使用最左侧的位以填充左侧。

  • 案例一 14 >> 2 -> 3

14 (base 10) = 00000000000000000000000000001110 (base 2)
--------------------------------------------------------
3  (base 10) = 00000000000000000000000000000011 (base 2)
  • 案例二 -14 >> 2 -> -4
14 (base 10) = 11111111111111111111111111110010 (base 2)
--------------------------------------------------------
-4 (base 10) = 11111111111111111111111111111100 (base 2)

无符号右移 - a >>> b

  • 将 a 的二进制表示向右移 b (< 32) 位,丢弃被移出的位,并使用 0 以填充左侧;

  • 案例一 14 >>> 2 -> 56

14 (base 10) = 00000000000000000000000000001110 (base 2)
--------------------------------------------------------
56 (base 10) = 00000000000000000000000000111000 (base 2)

当处理数为正数时,与有符号右移效果一样

  • 案例二 -14 >>> 2 -> 1073741820
14 (base 10) = 11111111111111111111111111110010 (base 2)
--------------------------------------------------------
1073741820 (base 10) = 00111111111111111111111111111100 (base 2)

参考资源

MDN-按位操作符