- 偷懒简写(|): 取整、断言
- 标志位判断 (&): 权限控制
- 去掉高位/低位(&): 比较特定位、子网掩码
- 数值交换(^): 加密算法、生成随机数/哈希
- 构造属性集(|): 边界判断
- 缺省数值类型值(|):默认端口
- 位填充(>>): HEX2RGB、leftPad
- 试图提升算术运算性能
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) |
原理: 位运算会默认将非数字类型转换成数字类型再进行运算
注意:
- 以上值(还有
-9.9|0
) 都为-9
, 而Math.floor(-9.9)
值为 -10- 位运算取整方法不适用超过32位整数最大值 2147483647 的数:
2147483649.4 | 0
的值为-2147483647
参考:
[1] 二进制位运算符
[2] 巧用 JS 位运算