手记

JS 位运算小结

位运算应用场景:
  1. 偷懒简写(|): 取整、断言
  2. 标志位判断 (&): 权限控制
  3. 去掉高位/低位(&): 比较特定位、子网掩码
  4. 数值交换(^): 加密算法、生成随机数/哈希
  5. 构造属性集(|): 边界判断
  6. 缺省数值类型值(|):默认端口
  7. 位填充(>>): HEX2RGB、leftPad
  8. 试图提升算术运算性能
位运算示例:

1. 求 2 的 n 次方:

bitwise ES5 ES6+
1 << n Math.pow(2, n) 2 ** n

原理: 左移一位, 相当于将原数值与 2 相乘一次 , 即 m << n === m * Math.pow(2, n)

2. 求中间索引

bitwise ES5 ES6+
arr.length >> 1 Math.floor(arr.length / 2)) -

原理: 右移一位,相当于原数值除 2 后向下取整

3. 判断索引存在

bitwise ES5 ES6+
!!~'abc'.indexOf('d') 'abc'.indexOf('d') !== -1 'abc'.includes('d')

原理: 按位非 ~-1 === 0

4. 变量交换

bitwise ES5 ES6+
a ^= b; b ^= a; a ^= b; t = a; b = a; b = t; [b, a] = [a, b]

原理: 按位异或 1 ^ 1 === 0, 0 ^ 0 === 1

5. 分支开关

bitwise ES5 ES6+
flag ^= 1; flag = flag ? 0 : 1; -

原理: 按位异或 1 ^ 1 === 0, 0 ^ 0 === 1

6. 截取整数位

bitwise ES5 ES6+
~~-9.9; -9.9>>0; parseInt(-9.9) Math.trunc(-9.9)

原理: 位运算会默认将非数字类型转换成数字类型再进行运算
注意:

  1. 以上值(还有 -9.9|0 ) 都为 -9, 而 Math.floor(-9.9) 值为 -10
  2. 位运算取整方法不适用超过32位整数最大值 2147483647 的数: 2147483649.4 | 0 的值为 -2147483647

参考:

[1] 二进制位运算符

[2] 巧用 JS 位运算

[3] 由left-pad扯到JS中的位运算

1人推荐
随时随地看视频
慕课网APP