按位与(&)是javascript中用于筛选或校验特定位是否开启的掩码操作,不改变原值,适用于权限检查、状态解析和集合交集等场景;其核心是通过2的幂掩码判断位状态、清除指定标志位及实现小整数集合交集,但需注意32位整数限制与非负数使用规范。

按位与(&)是 JavaScript 中最常用的掩码操作工具,核心作用是“筛选”或“校验”特定位是否开启。它不改变原值,只通过对比掩码提取关注的比特状态,速度快、无副作用,特别适合权限检查、状态解析和集合交集等场景。
用 & 检查某个标志位是否启用
当使用 2 的幂作为位掩码常量时(如 1、2、4、8),& 可精准判断某一位是否为 1:
- const READ = 1
- const WRITE = 1
- const EXECUTE = 1
- const userFlags = READ | WRITE; // 值为 3(二进制 011)
- const hasRead = (userFlags & READ) !== 0; // true
- const hasExecute = (userFlags & EXECUTE) !== 0; // false
关键点:结果非零即表示该位被设置;必须加括号避免运算符优先级干扰(& 优先级低于 ==)。
用 & 清除指定的位(关闭标志)
配合取反(~)可构造“清除掩码”,把目标位强制置 0,其余位保持不变:
- const ADMIN = 1
- let flags = READ | WRITE | ADMIN; // 15(1111)
- flags = flags & ~ADMIN; // 清除 ADMIN 位 → 结果为 7(0111)
原理:~ADMIN 得到一个除第 3 位外全为 1 的掩码,& 运算后仅第 3 位归零,其他不受影响。
用 & 实现集合交集(小整数范围)
当集合元素是 0~31 内不重复的非负整数时,可用单个 32 位整数编码整个集合,交集即一次 & 运算:
- const setA = [0, 2, 5].reduce((m, x) => m | (1
- const setB = [1, 2, 3].reduce((m, x) => m | (1
- const intersection = setA & setB; // 4(000100)→ 表示 {2}
- // 解码:[0,1,2,3,4,5].filter(i => intersection & (1
优势:O(1) 时间完成交集计算,远快于数组 filter + includes;但要求元素值紧凑且无重复。
注意事项和边界提醒
JavaScript 按位运算会自动将操作数转为 32 位有符号整数,因此需注意:
- 输入值应为安全整数(-2³¹ 到 2³¹−1),超出则行为不可靠
- 负数参与 & 时,会以补码形式运算,建议只对非负整数做掩码操作
- 若需支持大于 31 的索引(如 0~63),可用 BigInt 或拆分为多个 32 位整数管理
- 不要用 & 替代逻辑与(&&),二者语义和类型转换完全不同
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











