n & 1 比 n % 2 更快更安全,因其直接提取二进制最低位(0为偶、1为奇),是单周期硬件指令,无除法开销且对正负整数在补码下均可靠;而 %2 依赖除法指令,负数时行为可能不一致。

为什么用 & 而不是 %
直接用 n % 2 == 0 判断偶数最直观,但底层上,对 2 取余需要除法指令,而现代 CPU 对位运算有单周期支持。当 n 是非负整数时,n & 1 更快——它只取最低位:结果为 1 表示奇数,0 表示偶数。
注意:& 是按位与,不是逻辑与 &&;写成 n && 1 或 n & 2 都会出错。
n & 1 在有符号整数下是否安全
对大多数编译器和平台(使用二进制补码),int 的最低位含义不变:负奇数(如 -3)的二进制末位仍是 1,-3 & 1 结果是 1;负偶数(如 -4)末位是 0,-4 & 1 是 0。所以它仍能正确区分奇偶性。
但要注意:
-
n & 1返回的是int类型值(0 或 1),不是bool;若用于条件判断(如if (n & 1)),没问题;但若赋给bool变量,语义清晰,无隐患 - 若
n是unsigned char等小类型,参与&运算时会整型提升,不影响结果 - 不适用于浮点数或指针——它们不能直接和
1做位与
实际写法与常见误用
正确写法简洁明确:
if (n & 1) {
// n 是奇数
} else {
// n 是偶数
}
容易踩的坑:
- 写成
if (n & 0x01)没问题,但没必要;1就是0x01,可读性反而下降 - 写成
if (n & 2)判断“是否能被 4 整除”?错——那是看倒数第二位,和奇偶无关 - 把
n & 1和n | 1混淆:| 1是强制置为奇数,不是判断 - 在宏或模板中使用时,记得加括号:
#define IS_ODD(x) ((x) & 1),否则IS_ODD(a + b)会展开成a + b & 1,因优先级出错
性能差异真的明显吗
单次判断几乎感知不到差别,但在 tight loop(比如处理百万级数组)中,& 可省去除法流水线停顿。不过,现代编译器(如 GCC/Clang 开 -O2)通常会自动把 n % 2 优化为 n & 1,尤其对常量模数。
所以真正关键的不是手写 & 1,而是理解它背后的位模式——比如你要判断索引是否在偶数位置、掩码是否启用某标志位,这些场景里 & 是不可替代的原始工具。
别为了“快一点”硬套,但该用的时候,要确认自己清楚它在做什么、在什么范围内可靠。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











