用 n & 1 判断奇偶性最直接高效:利用整数最低位为1(奇)或0(偶),比 n % 2 != 0 更可靠,对有符号负数、边界值及无符号类型均安全,且明确表达位操作意图。

用 & 运算符判断奇偶性最直接
整数的最低位(bit 0)决定奇偶:1 表示奇数,0 表示偶数。所以 n & 1 的结果就是 1(真)或 0(假),无需取模运算。
实操建议:
-
n & 1比n % 2 != 0更快,尤其在循环或高频判断中;编译器通常能优化% 2,但显式位运算是明确意图 - 对有符号负数也成立:C++ 中负数补码表示下,
-3 & 1仍为1,-4 & 1为0 - 不要写成
n & 0x1或n & 0b1——虽然等价,但1更简洁、可读性不降
& 和 % 在边界值上行为一致吗?
是的,只要 n 是整型(int、long 等),n & 1 和 n % 2 == 1 对所有标准整数都给出相同布尔结果——包括 INT_MIN、-1、0。
但注意:n % 2 在 C++ 中对负数的结果是实现定义的(C++98/03),C++11 起规定向零取整,即 -3 % 2 == -1,所以必须写成 n % 2 != 0 才等价于 n & 1。
立即学习“C++免费学习笔记(深入)”;
实操建议:
- 永远用
(n & 1) == 1或直接作为条件(if (n & 1)),语义清晰且无歧义 - 避免
n % 2 == 1判断负奇数——它在n = -1时返回false - 如果变量类型可能是
unsigned,& 1依然安全;%则需确保右操作数非零
编译器会不会自动优化 % 2 成位运算?
现代编译器(GCC、Clang、MSVC)在优化级别 ≥ -O1 时,基本都会把 n % 2 替换为 n & 1,前提是 n 是整型且无符号或已知非负。
但问题在于:你无法依赖这种优化在所有上下文中生效。比如:
- 调试模式(
-O0)下,%仍走除法指令,性能差距明显 - 模板代码中若
n类型是泛型T,编译器可能无法推导出可位运算,保留除法 - 某些嵌入式平台或旧编译器版本不优化
%常量
所以主动写 n & 1 是更可靠的选择——不是为了“手动优化”,而是表达确定的底层意图。
什么情况下 & 1 会出错?
只有两类情况会失效:
-
n不是整型:比如float、double、指针、用户自定义类型——编译器直接报错,error: invalid operands to binary & -
n是窄类型(char、short)参与运算时,先整型提升(promoted toint),结果仍正确,但要注意符号扩展影响(例如char c = -1;→ 提升后为-1→-1 & 1 == 1,没问题)
真正容易被忽略的是:位运算只适用于整数。如果你在处理浮点输入(比如从字符串解析来的数字),得先转成整型再用 & 1,否则编译不过——这不是优化问题,是类型系统的基本约束。


















