JavaScript位运算符全面指南 ⚡
基础概念 📚
⚠️ 重要提示:
- JavaScript 将数字存储为 64 位浮点数
- 所有位运算都会先将数字转换为 32 位有符号整数后执行
- 位运算通常比普通算术运算更快
七种位运算符 🛠️
1. 按位与(AND) &
两位都为1时结果才为1:
js
// 1: 00000001
// 3: 00000011
console.log(1 & 3) // 12. 按位或(OR) |
任一位为1时结果为1:
js
// 1: 00000001
// 3: 00000011
console.log(1 | 3) // 33. 按位异或(XOR) ^
两位不同时结果为1:
js
// 1: 00000001
// 3: 00000011
console.log(1 ^ 3) // 24. 按位非(NOT) ~
位值取反:
js
// 1: 00000001
console.log(~1) // -2
// 💡 技巧:~n = -(n+1)5. 左移 <<
向左移动指定位数,右侧补0:
js
console.log(1 << 2) // 4 (1移动2位: 00000100)6. 有符号右移 >>
保持符号位,右移后左侧补符号位:
js
console.log(-8 >> 2) // -27. 无符号右移 >>>
忽略符号位,右移后左侧补0:
js
console.log(-8 >>> 2) // 1073741822实用技巧 💡
1. 快速判断奇偶
js
const isEven = n => (n & 1) === 0
console.log(isEven(4)) // true
console.log(isEven(7)) // false2. 高效取整
js
// 以下方法都可以取整
console.log(~~6.83) // 6
console.log(6.83 | 0) // 6
console.log(6.83 >> 0) // 6
// ⚠️ >>> 不适用于负数3. 变量交换
js
let a = 5, b = 8
a ^= b
b ^= a
a ^= b
// 现在 a=8, b=54. 判断2的幂
js
const isPowerOf2 = n => n > 0 && (n & (n - 1)) === 0
console.log(isPowerOf2(16)) // true
console.log(isPowerOf2(18)) // false新增实用场景 🎯
1. 权限系统
js
const PERMISSION = {
READ: 1, // 001
WRITE: 2, // 010
EXECUTE: 4 // 100
}
// 授权
let userPermission = PERMISSION.READ | PERMISSION.WRITE // 3
// 检查权限
const hasPermission = (userPerm, checkPerm) => (userPerm & checkPerm) === checkPerm
console.log(hasPermission(userPermission, PERMISSION.READ)) // true2. 颜色处理
js
// RGB转16进制
function rgbToHex(r, g, b) {
return '#' + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1)
}
console.log(rgbToHex(255, 255, 255)) // '#ffffff'注意事项 ⚠️
- 位运算只能用于整数,小数会被截断
- 大数处理时需注意32位限制
- 在可读性要求高的场景,优先使用常规运算
- 位运算符的优先级较低,复杂表达式建议使用括号
性能建议 🚀
- 位运算适用于简单的数值处理
- 在大量数据处理时,位运算可以提供显著性能提升
- 现代JavaScript引擎对普通运算已经做了很多优化,过度使用位运算可能适得其反