用 & 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
仅当操作数不是整数类型时失效:
float/double:必须先转整型(但需注意截断),不能直接 &
boost::multiprecision::cpp_int):需查文档是否支持位运算enum class):默认不支持 &,需显式转换为底层类型,如 static_cast<:underlying_type_t>>(e) & 1
核心就一条:确保操作数是整型(int、long、unsigned short 等),& 1 就是最简、最稳、最通用的奇偶判断方
