在需要频繁做布尔判定的系统里,位运算往往是隐藏在源码背后的加速器。它不依赖于分支预测,也不受函数调用开销的影响,仅凭 CPU 的原生指令即可完成数值的“是/否”。于是,判断一个整数是否满足特定属性时,位运算几乎成了首选。
n & 1 为 0 表示偶数。(n & (n - 1)) == 0 && n > 0。n & 7。(a ^ b) >= 0。__builtin_parity(n)(GCC 内建)。位运算之所以快,根本原因在于它们对应的机器指令往往只有一个时钟周期。以 n & (n - 1) 为例,n - 1 产生的进位会把最低位的 1 清零,而 n & … 再次掩掉剩余的所有 1,若结果为 0 则说明原数只有一个 1,即 2 的幂。整个过程不涉及循环,也不产生分支跳转。
// C 语言:判断是否为 2 的幂
bool isPowerOfTwo(unsigned int n) {
return n && !(n & (n - 1));
}
// JavaScript:快速判断奇偶
function isOdd(n) { return (n & 1) === 1; }
在一次 10⁷ 次循环的基准测试中,使用 n % 2 的除法路径平均耗时约 45 ns,而 n & 1 只需 7 ns,差距相当于同等时间内可以多跑六次循环。对于网络包过滤、图像像素处理等高吞吐场景,这种微秒级的节省会直接转化为带宽提升。
| 判定方式 | 指令数 | 平均时延 (ns) |
| 除法取模 | ≈3 | 45 |
| 位与掩码 | ≈1 | 7 |
某公司内部的文件系统采用 32 位整数保存用户权限,每一位对应一种操作(读、写、删除、共享等)。在一次审计任务中,需要快速筛选出拥有“写且不允许删除”权限的记录。传统做法是两次 if 判断,代码可读性不错,却在 500 万条记录上耗时近 3 秒。改写为单行位运算:
// 假设 WRITE = 0x02, DELETE = 0x04
bool match = (perm & (WRITE | DELETE)) == WRITE;
一次遍历即可完成过滤,整体耗时下降至 0.6 秒,CPU 利用率也随之下降。更重要的是,这段代码在审计报告里一目了然,后续维护时只需解释位掩码的含义即可。
参与讨论
这个技巧在嵌入式里太实用了,省资源👍
n & (n – 1) 这个真绝了,之前写单片机一直用循环数1,慢死了
想问下这种位运算在JavaScript高并发场景下实际提升明显吗?
前几天优化图像处理算法,换成位运算后帧率直接涨了15%,真实用
感觉取模8那里可以再讲细点,&7是怎么推出来的?