优先用 n & 1 判断整型奇偶,它不依赖符号、性能好且结果稳定;负数时 % 2 可能返回负余数,存在隐患;BigInteger 应用 testBit(0) 或 remainder(TWO)。

用 % 判断奇偶:最直接但要注意负数
Java 里最常用的是 %(取模)运算:n % 2 == 0 表示偶数,n % 2 != 0 表示奇数。但它对负数的行为容易让人掉坑——比如 -3 % 2 结果是 -1,不是 1,所以 -3 % 2 != 0 虽然成立,逻辑上没错,但依赖符号可能让条件判断变脆弱。
-
%的结果符号和被除数一致,不是数学意义上的“余数” - 如果输入来自用户或外部系统,可能含负数,别假设
n % 2只会返回0或1 - 对
int和long都适用,但对float/double不能直接用——会编译报错bad operand types for binary operator '%'
用 & 1 判断奇偶:快且稳定,但仅限整型
位运算 n & 1 是更底层、也更可靠的判断方式:二进制最低位为 1 就是奇数,为 0 就是偶数。它不关心正负,-3 & 1 也是 1,-4 & 1 是 0,结果始终符合预期。
- 只适用于
int、long、short、byte等整数类型;char也可以(自动提升为int) - 对
Integer包装类要先intValue(),否则触发空指针——num == null ? false : (num & 1) == 1 - 性能略优于
%,不过在绝大多数业务场景里这点差异可忽略
处理 BigInteger 时别硬套 & 1
BigInteger 没有位运算符重载,也不能直接用 % 写成 n % 2(因为 % 不支持 BigInteger 和 int 混用)。必须用它的实例方法。
- 正确写法是
n.remainder(BigInteger.TWO).equals(BigInteger.ZERO)判断偶数 - 或者更简洁地用
n.testBit(0):返回true表示最低位是1,即奇数 -
testBit(0)效率高、语义清晰,是BigInteger场景下的首选
别在循环里反复调用 Math.abs(n) % 2
有人想“规避负数问题”,就写 Math.abs(n) % 2 == 0。这看似保险,其实引入两个隐患:
立即学习“Java免费学习笔记(深入)”;
-
Math.abs(Integer.MIN_VALUE)会溢出,返回Integer.MIN_VALUE本身(仍是负数),导致误判 - 每次调用
Math.abs多一次方法开销,虽小但在高频循环中可测出差异 - 真正需要“绝对值后奇偶”的场景极少;大多数时候你要的只是“这个数本身是奇还是偶”,直接用
& 1更准更省
& 1 在整型范围内几乎没缺点,但一碰到包装类或 BigInteger,就得切回对应 API,这点很容易漏。










