用 & 1 判断奇偶性可行,因整数二进制补码表示下最低位为1即奇数、0即偶数;该方式比 % 2 更高效且对负数安全,但仅适用于整型。

用 & 判断奇偶性为什么可行
因为整数在内存中以二进制补码形式存储,最低位(bit 0)直接决定奇偶:偶数最低位是 0,奇数是 1。对任意整数 n 执行 n & 1,等价于提取其最低位 —— 结果为 1 即奇数,0 即偶数。
n & 1 比 n % 2 != 0 更快吗
现代编译器(如 GCC/Clang/MSVC)在优化级别 ≥ -O2 时,通常会把 n % 2 自动优化为 n & 1,尤其对有符号整数。但手动写 & 1 仍更明确、无符号歧义:
-
n % 2对负数行为依赖实现:C++98/03 中-3 % 2可能是-1或1;C++11 起规定向零取整,-3 % 2 == -1,此时-3 % 2 != 0仍为true,逻辑正确但隐含取模开销 -
n & 1对所有整数(含负数)都安全,且是单条 CPU 指令(如 x86 的and),无分支、无符号扩展顾虑
实际写法与常见错误
直接用 (n & 1) == 1 判断奇数,或 (n & 1) == 0 判断偶数。注意以下几点:
- 不要写成
n & 1 == 1—— 因为==优先级高于&,等价于n & (1 == 1)→n & true→n & 1(侥幸正确但极度危险) - 对
unsigned类型最稳妥,int也完全安全(补码下& 1不受符号位影响) - 避免用于浮点数或用户自定义类型 ——
&运算符未重载时编译失败
int n = -5;
if ((n & 1) == 1) {
// 正确:-5 是奇数,条件成立
}
if (n & 1) { // 也可,因非零即真,但可读性略低
// 同样成立
}
什么情况下不能用 & 1
仅当操作数不是整数类型时失效:
立即学习“C++免费学习笔记(深入)”;
-
float/double:必须先转整型(但需注意截断),不能直接& - 大整数类(如
boost::multiprecision::cpp_int):需查文档是否支持位运算 - 枚举类(
enum class):默认不支持&,需显式转换为底层类型,如static_cast<:underlying_type_t>>(e) & 1
核心就一条:确保操作数是整型(int、long、unsigned short 等),& 1 就是最简、最稳、最通用的奇偶判断方式。











