Java取余操作符陷阱:修复isOdd方法

需积分: 0 0 下载量 109 浏览量 更新于2024-07-20 收藏 1.19MB PDF 举报
"Java解惑" 书籍片段讨论了一个关于Java中的取余操作符 `%` 的问题,特别是涉及判断奇数的函数 `isOdd()`。 在这个问题中,原始的 `isOdd` 方法通过检查 `i % 2 == 1` 来判断一个整数是否为奇数。虽然这个逻辑看似正确,但在处理负数时会出现问题,因为当 `i` 是负奇数时,`i % 2` 实际上会得到 `-1`,导致方法错误地返回 `false`。这源于Java中取余操作符 `%` 的定义,它保证了 `(a / b) * b + (a % b) == a` 对于所有非零的 `b` 都成立。然而,当 `a` 为负数时,取余结果的符号与 `a` 相同,而不是与 `b`。 为了解决这个问题,作者建议修改 `isOdd` 方法,使其不检查余数是否等于 `1`,而是检查是否不等于 `0`,如下所示: ```java public static boolean isOdd(int i) { return i % 2 != 0; } ``` 这样的修改确保了无论正负,只要余数不为零,方法就会正确地标识出奇数。另一种优化方案是在性能至关重要的情况下,使用位操作符 `AND (&)`: ```java public static boolean isOdd(int i) { return (i & 1) != 0; } ``` 这里,`(i & 1)` 将只考虑 `i` 的最低位,因为对于二进制表示,只有奇数的最低位为1。位操作通常比算术运算更快,所以这在性能敏感的代码中可能是优选。 总结来说,这个章节提醒我们,理解编程语言中特定运算符的行为至关重要,特别是在边界情况和异常情况下的行为。在编写和调试代码时,应当充分考虑各种可能的输入值,包括负数、零和正数,以确保代码的健壮性和正确性。对于涉及到取余操作的代码,要特别注意负数的情况,以免出现意料之外的结果。