当除数是2的整数次幂时,可用x & (n−1)替代x % n(x≥0),因其等价于提取x的低k位二进制位;但负数或非2的幂除数时不适用,如-5 & 3≠-5 % 4。

当除数是 2 的整数次幂(如 2、4、8、16…)时,可以用位运算 x & (n - 1) 替代 x % n,前提是 x ≥ 0 且 n 是 2 的正整数次幂。这是最常用、最安全的优化场景。
为什么能用 & 替代 %?
因为对 2k 取余,等价于保留 x 的低 k 位二进制位。而 n = 2k 时,n - 1 的二进制是 k 个 1(例如:8 → 1000,7 → 0111),x & (n - 1) 正好提取低 k 位。
- 13 % 8 → 13 & 7 → 1101 & 0111 = 0101 = 5 ✅
- 27 % 16 → 27 & 15 → 11011 & 01111 = 01011 = 11 ✅
必须注意的限制条件
这个优化不适用于负数或非 2 的幂的除数:
- -5 % 4 === -1,但 -5 & 3 === 3 → 结果完全不同
- 17 % 6 无法用 & 表达,因为 6 不是 2 的幂
- JavaScript 中 % 运算符返回的是“带符号余数”,而 & 总是无符号按位与,语义不同
安全替换的写法(支持非负整数)
如果确定输入 x ≥ 0,可直接替换;若不确定,建议先做非负处理:
立即学习“Java免费学习笔记(深入)”;
- ✅ 安全(已知 x 非负):
const mod = x & 7; // 等价于 x % 8 - ✅ 兼容负数(需保持 % 行为):
const mod = ((x % n) + n) % n;(不推荐位运算替代) - ⚠️ 错误示范:
x & 7直接用于可能为负的 x → 逻辑错误
实际应用中的典型场景
这类优化常见于底层算法或高频循环中,例如:
- 哈希表桶索引:
index = hash & (capacity - 1)(要求 capacity 是 2 的幂) - 环形缓冲区读写位置:
buffer[writeIndex & (size - 1)] - 颜色通道提取:
blue = rgb & 0xFF(本质是 % 256)


















