按位与(&)是最常用可靠的特定位检测方式,通过构造掩码(如1<<k)与原数相与,结果非零即表明第k位为1。

直接用按位与(&)检测特定位是否为1,是最常用也最可靠的判定方式。
用 & 提取指定比特位的状态
要判断一个整数变量是否在某一位上为1,核心是构造掩码,再与原数做按位与。结果非零说明该位被置起。
- 比如判断第3位(从0开始计)是否为1:写 (n & (1 ,等价于 (n & 8) != 0
- 若需同时检查多个位(如第0位和第2位),掩码写成 (1 ,即 1 | 4 = 5,再用 (n & 5) == 5 判定两者是否都为1
- 注意括号不能省——n & 1 因运算符优先级会先算 1 ,但若写成 n & 1 就可能出错,务必加括号明确逻辑边界
用 ^ 快速翻转特定开关位
当需要切换某个属性的开启/关闭状态(比如“是否隐藏”),异或操作比先读再写更原子、更简洁。
- 设 HIDDEN = 1 (即第1位),当前状态为 status
- 执行 status ^= HIDDEN,就能让该位0变1、1变0,其余位不变
- 这比 status = status | HIDDEN(只开)或 status = status & ~HIDDEN(只关)更灵活,适合UI按钮类交互
用 & ~ 清除指定比特位
清除某一位(强制设为0),本质是让该位与0相与,其余位与1相与——也就是跟取反后的掩码做与运算。
- 例如清除第4位:status = status & ~(1 ,其中 ~(1 是除第4位外全为1的掩码
- 这个技巧常用于权限回收:用户原本有 VIEW | EDIT | DELETE(即 1 | 2 | 4 = 7),要撤掉 EDIT(2),就写 perm &= ~EDIT
- 避免写成 perm = perm - EDIT,因为减法不保证只影响目标位(比如 7 - 2 = 5,看似正确,但若权限值重叠或设计不规范,结果不可靠)
常见误判陷阱与规避方法
位运算逻辑简洁,但几个经典错误容易导致隐性bug。
- 混淆逻辑或 || 和位或 |:写 if (flag == A | B) 实际是 if (flag == (A | B)),且 | 优先级低于 ==,极易误判;正确应为 if ((flag & A) && (flag & B)) 或 if ((flag & (A | B)) == (A | B))
- 把复合状态当枚举用 == 比较:ACTIVE | LOCKED 可能等于 3,但 PENDING | HIDDEN 也可能凑巧是 3,用 == 会误认为状态相同;必须用 & 检测子集关系
- 忽略符号位影响:对负数做右移(>>)在某些语言中是算术移位,高位补1,可能导致意外结果;如需无符号行为,应先转为无符号类型或用 >>>(如JavaScript)

















