Java中的取余运算陷阱:解析isOdd方法

需积分: 9 6 下载量 169 浏览量 更新于2024-07-28 收藏 1.19MB PDF 举报
"Java解惑(中文)这本书探讨了Java编程中的一些常见困惑,特别是关于表达式的谜题。其中,文章举例分析了一个用于检测整数奇偶性的`isOdd`方法,指出该方法在处理负奇数时会出现错误。问题在于Java的取余运算符 `%` 在负数情况下返回的结果可能不符合直觉。为了确保方法的正确性,我们需要考虑对各种边界情况,包括负数、零和正数进行测试。修复这个问题的一个方法是修改比较条件,或者使用位操作符`AND (&)`来提高效率。" 在这段摘要中,我们可以提炼出以下几个Java编程相关的知识点: 1. **取余运算符 `%**`: Java中的取余运算符 `%` 对于负数操作数有特定的行为,返回值与左操作数有相同的符号。这意味着对于负奇数,`i % 2` 不会返回预期的1,而是返回-1。 2. **边界条件测试**: 有效的代码需要能够处理所有可能的输入,包括边界条件。在本例中,`isOdd` 方法没有正确处理负数,导致错误。开发者应当习惯于在编写函数时对负数、零和正数进行测试。 3. **错误的`isOdd` 实现**: ```java public static boolean isOdd(int i) { return i % 2 == 1; } ``` 这个实现对于负奇数会返回 `false`,因为它不考虑负数的情况。 4. **修复`isOdd` 的方法**: - 修改比较条件: ```java public static boolean isOdd(int i) { return i % 2 != 0; } ``` - 使用位操作符`AND (&)`: ```java public static boolean isOdd(int i) { return (i & 1) != 0; } ``` 上述两种方式都能确保方法正确判断奇偶性,特别是第二种方法在性能敏感的场景下可能更优。 5. **位操作符 `&`**: 位操作符在Java中用于按位进行AND运算。在二进制表示中,`i & 1` 只检查最右边的一位,即最低位,这对应于数字的奇偶性。如果最低位为1,那么数字是奇数,否则是偶数。 6. **恒等式 `(a/b)*b + (a%b) == a`**: 这是取余运算符 `%` 的数学性质,表示整除和取余的组合始终能恢复原始数值。但需要注意的是,Java中的整数除法会向下取整,可能会导致负数取余的特殊行为。 7. **性能优化**: 当关心代码执行效率时,位操作通常比算术运算更快,因为它们在硬件级别直接支持。因此,对于性能关键的代码,使用位操作符可能是更好的选择。 了解这些知识点对于提升Java编程技能和避免潜在的错误至关重要。在实际编程中,不仅要理解语言的语法,还需要深入理解其底层行为,特别是对于那些可能产生非直观结果的操作。
2011-05-08 上传
********Shenkxiao Resources******** 压缩包密码:shenkxiao 资源:Java解惑(中文版)、java puzzlers traps pitfalls,and Corner Cases 作者:Joshua Bloch Neal Gafter 版本:中文版 主要内容: Java解惑(英文版)—典藏原版书苑 目录 1 introduction 2 expressive puzzlers puzzle 1:oddity puzzle 2:time for a change puzzle 3:long pision puzzle 4:it s elementary puzzle 5:the joy of hex puzzle 6:multicast puzzle 7:swap meat puzzle 8:dos equis puzzle 9:tweedildum puzzle 10:tweedledee 3 przzlers with character puzzle 11:the last laugh puzzle 12:abc puzzle 13:animal farm puzzle 14:escape rout puzzle 15:hello whirled puzzle 16:line printer puzzle 17:huh? puzzle 18:string cheese puzzle 19:classy fire puzzle 20:what s my class? puzzle 21:what s my class,take2 puzzle 22:dupe of url puzzle 23:no pain,no gain 4 loopy puzzlers puzzle 24:a big delight in every byte puzzle 25:inclement increment puzzle 26:in the loop puzzle 27:shifty i s puzzle 28:looper puzzle 29:bride of loper puzzle 30:son of loper puzzle 31:ghost of looper puzzle 32:curse of looper puzzle 33:looer meets the wolfman puzzle 34:down for the count puzzle 35:minute by minute 5 exceptonal puzzlers 6 classy puzzlers 7 library puzzlers 8 classier puzzlers 9 more library puzzlers 10 advanced puzzlers a catalog of traps and pitfalls b notes on the illusions refereces index 本书深入研究Java编程语言及其核心类为的细微之处,特写95个有关Java或其他类库的陷阱和缺陷的谜题,其中大多数谜题都采用短程序的形式给出。在每个谜题之后都有详细的解惑方案,这些方案在给出那些实际行为与表面上迥异的程序行为的简单解释的同时,更向读者展示了如何一劳永逸地避免底层的陷阱与缺陷。本书附录部分列出了陷阱及缺陷的目录,可供读者进一学习参考。 本书以轻松诙谐的语言,寓教于乐的方式,由浅入深、总结归纳Java编程语言的知识点,适合具有Java知识的学习者和有编程经验的Java程序员阅读。 上传理由:精品典藏共享,网络上下载该资源太费劲,我来共享吧 因为是精品所以分数也比较高。 ***********************************