用 n & 1 判断奇偶最直接高效:结果为1是奇数、0是偶数;它对负数安全且比 n % 2 更可靠,因位运算在补码系统中行为确定,而负数取模在C++中存在实现依赖风险。

用 & 运算符判断奇偶最直接
整数的最低位(bit 0)决定了奇偶:0 表示偶数,1 表示奇数。所以只需检查该位是否为 1,用 n & 1 即可——结果是 1 就是奇数,0 就是偶数。
比 n % 2 == 0 更快,且对负数也适用(C++ 中负数取模行为依赖实现,但位运算是确定的)。
-
n & 1对所有有符号整数类型(int、short、long long)都安全,前提是底层用补码表示(现代系统全部如此) - 不要写成
n & 0x1或n & 0b1——虽然等价,但1更简洁、意图更清晰 - 避免误用
|或^:比如n | 1会改值,n ^ 1在偶数时变奇、奇数时变偶,不是判断
为什么不用 %?它在某些场景下不靠谱
n % 2 看似直观,但在 C++ 标准中,当 n 为负数时,余数符号由实现定义(C++11 起要求与被除数同号,但旧编译器或严格模式下仍有风险)。例如:
std::cout << (-3 % 2); // 可能输出 -1(GCC/Clang),也可能输出 1(某些嵌入式平台)
而 -3 & 1 恒为 1,-4 & 1 恒为 0,行为完全可预测。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
立即学习“C++免费学习笔记(深入)”;
- 若代码需跨平台或处理传感器/协议传来的负偏移量,优先选位运算
- 编译器通常能将
n & 1优化成单条test或and指令;%可能引入除法指令(尤其未被常量折叠时) - 模板元编程或
constexpr上下文中,&更易被编译期求值
注意无符号类型和字面量类型陷阱
看似简单的表达式,在类型隐式转换下可能出问题:
- 如果
n是unsigned char,n & 1结果类型是int(整型提升),比较时没问题;但若写成if (n & 1 == 1),由于==优先级高于&,实际执行的是n & (1 == 1)→n & true→n & 1,侥幸正确;但逻辑混乱,务必加括号:if ((n & 1) == 1) - 对
bool类型变量做& 1没意义——bool非0即1,直接用即可 - 宏定义中慎用:如
#define IS_ODD(x) ((x) & 1),必须包住x,否则IS_ODD(a + b)会展开为(a + b) & 1,没问题;但若漏括号写成#define IS_ODD(x) x & 1,if (IS_ODD(a) == 1)就变成if (a & 1 == 1),出错
实际工程中别为了位运算而位运算
除非在性能敏感路径(如图像逐像素处理、高频信号采样判断)、或需要明确语义(如硬件寄存器位域解析),否则可读性优先。现代编译器对 n % 2 == 0 通常也会自动优化为位运算。
真正容易被忽略的是:位运算只适用于整数类型。浮点数、指针、用户自定义类型不能直接用 & 1;若误用于 double 或迭代器,编译报错会指向位运算操作符重载缺失,而非“类型不匹配”,排查起来反而绕路。

















