Java取余操作符陷阱:修复isOdd方法
需积分: 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。位操作通常比算术运算更快,所以这在性能敏感的代码中可能是优选。
总结来说,这个章节提醒我们,理解编程语言中特定运算符的行为至关重要,特别是在边界情况和异常情况下的行为。在编写和调试代码时,应当充分考虑各种可能的输入值,包括负数、零和正数,以确保代码的健壮性和正确性。对于涉及到取余操作的代码,要特别注意负数的情况,以免出现意料之外的结果。
2018-02-10 上传
2011-08-31 上传
2009-06-05 上传
2023-06-15 上传
2018-01-31 上传
2008-10-07 上传
2024-10-13 上传
yangymy
- 粉丝: 16
- 资源: 18
最新资源
- zlib-1.2.12压缩包解析与技术要点
- 微信小程序滑动选项卡源码模版发布
- Unity虚拟人物唇同步插件Oculus Lipsync介绍
- Nginx 1.18.0版本WinSW自动安装与管理指南
- Java Swing和JDBC实现的ATM系统源码解析
- 掌握Spark Streaming与Maven集成的分布式大数据处理
- 深入学习推荐系统:教程、案例与项目实践
- Web开发者必备的取色工具软件介绍
- C语言实现李春葆数据结构实验程序
- 超市管理系统开发:asp+SQL Server 2005实战
- Redis伪集群搭建教程与实践
- 掌握网络活动细节:Wireshark v3.6.3网络嗅探工具详解
- 全面掌握美赛:建模、分析与编程实现教程
- Java图书馆系统完整项目源码及SQL文件解析
- PCtoLCD2002软件:高效图片和字符取模转换
- Java开发的体育赛事在线购票系统源码分析