- 偷懒简写(|): 取整、断言
- 标志位判断 (&): 权限控制
- 去掉高位/低位(&): 比较特定位、子网掩码
- 数值交换(^): 加密算法、生成随机数/哈希
- 构造属性集(|): 边界判断
- 缺省数值类型值(|):默认端口
- 位填充(>>): HEX2RGB、leftPad
- 试图提升算术运算性能
| bitwise | ES5 | ES6+ |
|---|---|---|
| 1 << n | Math.pow(2, n) | 2 ** n |
2. 求中间索引原理: 左移一位, 相当于将原数值与 2 相乘一次 , 即 m << n === m * Math.pow(2, n)
| bitwise | ES5 | ES6+ |
|---|---|---|
| arr.length >> 1 | Math.floor(arr.length / 2)) | - |
3. 判断索引存在原理: 右移一位,相当于原数值除 2 后向下取整
| bitwise | ES5 | ES6+ |
|---|---|---|
| !!~'abc'.indexOf('d') | 'abc'.indexOf('d') !== -1 | 'abc'.includes('d') |
4. 变量交换原理: 按位非 ~-1 === 0
| bitwise | ES5 | ES6+ |
|---|---|---|
| a ^= b; b ^= a; a ^= b; | t = a; b = a; b = t; | [b, a] = [a, b] |
5. 分支开关原理: 按位异或 1 ^ 1 === 0, 0 ^ 0 === 1
| bitwise | ES5 | ES6+ |
|---|---|---|
| flag ^= 1; | flag = flag ? 0 : 1; | - |
6. 截取整数位原理: 按位异或 1 ^ 1 === 0, 0 ^ 0 === 1
| 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 位运算
[3] 由left-pad扯到JS中的位运算



