c++中如何判断一个数是否为奇数_c++按位与运算判断奇偶性【详解】

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

c++中如何判断一个数是否为奇数_c++按位与运算判断奇偶性【详解】

& 判断奇偶性为什么可行

因为整数在内存中以二进制补码形式存储,最低位(bit 0)直接决定奇偶:偶数最低位是 0,奇数是 1。对任意整数 n 执行 n & 1,等价于提取其最低位 —— 结果为 1 即奇数,0 即偶数。

n & 1n % 2 != 0 更快吗

现代编译器(如 GCC/Clang/MSVC)在优化级别 ≥ -O2 时,通常会把 n % 2 自动优化为 n & 1,尤其对有符号整数。但手动写 & 1 仍更明确、无符号歧义:

  • n % 2 对负数行为依赖实现:C++98/03 中 -3 % 2 可能是 -11;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 & truen & 1(侥幸正确但极度危险)
  • unsigned 类型最稳妥,int 也完全安全(补码下 & 1 不受符号位影响)
  • 避免用于浮点数或用户自定义类型 —— & 运算符未重载时编译失败
int n = -5;
if ((n & 1) == 1) {
    // 正确:-5 是奇数,条件成立
}
if (n & 1) {  // 也可,因非零即真,但可读性略低
    // 同样成立
}

什么情况下不能用 & 1

仅当操作数不是整数类型时失效:

Warp

Warp

新一代的终端工具(内置AI命令搜索)

下载

立即学习C++免费学习笔记(深入)”;

  • float/double:必须先转整型(但需注意截断),不能直接 &
  • 大整数类(如 boost::multiprecision::cpp_int):需查文档是否支持位运算
  • 枚举类(enum class):默认不支持 &,需显式转换为底层类型,如 static_cast<:underlying_type_t>>(e) & 1

核心就一条:确保操作数是整型(intlongunsigned short 等),& 1 就是最简、最稳、最通用的奇偶判断方式。

https://www.php.cn/faq/2030768.html

发表回复

Your email address will not be published. Required fields are marked *