最安全通用的奇偶判断是n % 2 == 0判偶、n % 2 != 0判奇,因负数取模余数符号因语言而异,但是否为0恒定;位运算n & 1虽快但语义不如%直观,abs等冗余操作反而引入风险。

直接用 n % 2 == 0 判断偶数,其余都是奇数 —— 这是最安全、最通用的做法,不依赖正负号,也不需要额外转换。
为什么不能写 n % 2 == 1 判断奇数
在 C++、Java 等有符号整数语言中,-3 % 2 的结果是 -1,不是 1。所以 n % 2 == 1 会漏掉所有负奇数(比如 -1、-3、-5)。Python 虽然返回 1,但混用语言时容易出错,统一用 != 0 或直接取反更稳妥。
-
n % 2 == 0→ 偶数(对所有整数都成立,包括 0、负数) -
n % 2 != 0→ 奇数(推荐,覆盖全部情况) - 避免
n % 2 == 1或n % 2 == -1—— 多条件、易遗漏、无必要
n & 1 比 % 2 快,但要注意语义和类型
位运算 n & 1 看的是二进制最低位,在补码表示下对任意有符号整数都有效,且通常编译器能优化成单条指令。但它不是“取模”,而是位操作,语义上不如 % 2 直观。
-
n & 1 == 0→ 偶数;n & 1 == 1→ 奇数 - 对
char、short等小整型,会先整型提升为int,行为一致 - 别对
bool用:bool b = true; b & 1虽然得 1,但语义混乱,直接用b就行
别用 std::abs(n) % 2 或 abs(n) % 2
加 abs 是典型画蛇添足:奇偶性本就与符号无关,n % 2 的结果已经能准确反映奇偶,再套一层 abs 不仅多一次函数调用,还可能引发溢出(如 INT_MIN 取绝对值未定义)。
-
std::abs(INT_MIN)在多数平台触发未定义行为 -
abs(-4)返回 4,再% 2得 0 —— 结果没错,但路径冗余、风险白增 - 真正要处理的不是“符号”,而是“余数是否为 0”
真正容易被忽略的是:不同语言对负数取模的定义虽有差异,但 == 0 这个判断永远可靠。只要记住“余数为 0 就是偶数”,其他分支全可省略。










