The following method purports to determine whether its sole argument is an odd number.Does the method work?
public static boolean isOdd(int i){
return i % 2 ==1;
}
Solution:
An Odd number can be defined as an integer that is divisible by 2 with a remainder of 1.The expression i % 2
computes the remainder when i is divided by 2, soit would semm that this program ought to work.Unfortunately, it
doesn't;it returns the wrong answer one quarter of the time;
Why one quarter? Because half of all int values are negative, and the isOdd method fails for all negative odd
values.It returns false when invoked on any negative value, whether even or odd.
This isa consequence of the definition of Java's remainder operator (%).It is defined to satisfy the following
identity for all int values a and all nonzero int values b:
(a / b) * b + (a % b)== a
In other words, if you divide a by b, multiply the result by b, and add the remainder, you rare back where you started
[JLS 15.17.3].This identity makes perfect sense, but in combination with Java's truncating integer division operator
[JLS 15.17.2],it implies that when the remainder operation returns a nonzero result, it has the same sign as its left
operand.
The is Odd method and the definition of the term odd on which it was based both assume that all remainders
are positive. Although this assumption make sense for some kinds of division [Boxing],Java's remainder operation is
perfect matched to its integer division operation, which discards the fractional part of its result.
When i is a negative odd number, i % 2 is equal to -1 rather than 1,so the isOdd method incorrectly returns
false.To prevent this sort of surprise,test that your method behave properly when passed negative, zero, and
positive values for each numerical parameters.
The problem is easy to fix. Simply compare i% 2 to 0 rather than to 1,and reverse the sense of the comparison:
public static boolean isOdd(inti){
return i % 2 != 0;
}
If you are using the isOdd method in a performance-critical setting, you would be better off using the bitwise
AND operator (&) in place of the remainder operator:
public static boolean isOdd(int i) {
return (i & 1) != 0;
}
The second version may run much faster than the first, depending on what platform and virtual machine you are
using, and is unlikely to run slower.As a general role, the divide and remainder operations are slow compared to
other arithmetic and logical operations.It's a bad idea to optimize prematurely, but in this case, the faster version is
as clear as the original, so there is no reason to prefer the original.
In summary, think about the signs of the operands and of the result whenever you use the remainder
operator.The behavior of this operator is obvious when its operands are nonnegative,but it isn't so obvious when
one or both operands are negative.
分享到:
相关推荐
:puzzle_piece: :brain: Puzzles允许您在定制的 Visual Studio Code 环境中提高编码技能并添加您自己的测试。 解决来自 Reddit 的 、 和 功能齐全的 IDE 中的问题,而不是<textarea /> (呃),并编写自定义...
#### 一、Java Puzzle概览 Java Puzzles是一种特殊的学习方式,通过解决一些令人困惑或意想不到行为的代码片段来加深对Java语言特性的理解。这种方式不仅能帮助开发者避免常见的编程陷阱,还能在轻松愉快的过程中...
《Puzzle:一个简单的益智游戏》是一款基于Java开发的益智类游戏,旨在提供轻松愉快的休闲体验,让玩家在解决拼图的过程中锻炼思维和观察力。游戏的核心概念是将用户选择的图像分割成一定数量的小块,然后打乱顺序,...
- **类与对象**:Java是面向对象的语言,通过定义类来封装数据和行为,创建对象进行实例化。 - **数据类型**:包括基本类型(如int、char)和引用类型(如类、接口、数组)。 - **封装、继承与多态**:这是面向...
### Java Puzzles知识点概述 #### 一、Java Puzzle概览 Java Puzzle是一种用来测试Java开发者对于语言特性和编程陷阱理解的小程序。这些程序通常简短但行为却出乎意料,通过解决这些谜题可以帮助程序员更好地理解...
有两个证据可以证明这一点: 对于随机生成的15个难题,DFS总是会出现以下错误: java.lang.OutOfMemoryError: GC overhead limit exceeded如果我通过改组最终状态难题来创建15个拼图,那么随着改组次数的增加,DFS...
字谜 这是一个单词搜索生成器,但是在将单词添加到2D数组时遇到了麻烦。 我有一个检查方法,以查看是否可以将单词放置在2d数组中,但是由于某些原因它不起作用。 我不知道我在做什么错。 如果您发现我的错误或对改进...
该应用程序是一个简单的交换益智游戏。 在此游戏中,图像被切成相同大小的多个正方形块。 作品以随机顺序放置。... 要运行项目,请使用Puzzle.jar或Puzzle.exe。 有关完整的项目描述,请参见Wiki。
《Java Puzzler》是Java开发者的一本独特指南,它以一种有趣且富有挑战性的方式揭示了语言中的陷阱和易犯错误。这本书的核心理念是通过一系列精心设计的谜题,帮助读者深入理解Java语言的微妙之处,从而提高编程技能...
6. 自动装箱和拆箱:Java 5引入的特性,允许基本类型和其包装类之间无缝转换。 在描述中提到的"com.mysterymaster.puzzles"软件包中,我们可以推测这个项目可能包含各种谜题游戏的实现,比如逻辑谜题、数独或字谜。...
Sliding Block Puzzles 是一款类似于 Rush Hour 的益智游戏,使用 Java Swing 库实现。 游戏由适合有限区域的许多棋子组成。 目标是将其中一个棋子(标记为“Z”的“目标棋子”)移动到特定位置。 通常,目标只能...
这份"JAVA-Puzzles-section.zip"压缩包中包含了一份名为"智力题部分.doc"的文档,很可能是整理了一些与Java相关的逻辑谜题和算法问题。下面我们将深入探讨这些知识点。 首先,Java逻辑思维能力主要体现在对语言特性...
15件益智游戏 项目构想链接: : 方法: 单人游戏,系统将提示用户输入名称 将显示游戏布局,其中包括游戏面板,控件,历史记录面板,排行榜-根据完成游戏的移动次数和时间得出,而页脚面板则显示名称,时钟和移动...
"puzzles:编码问题"这个主题通常包含一系列精心设计的小问题,旨在锻炼编程思维和技巧。这里我们将深入探讨与Java编程相关的编码难题,以及如何通过解决这些问题来提升你的编程技能。 1. **基本语法和数据类型**:...
1_Puzzles.java
puzzle collection. The collection's web site is at . If you've obtained the source code by downloading a .tar.gz archive from the Puzzles web site, you should find several Makefiles in the source code...
您必须修改Puzzle.java类才能使最不成功的成功。 预计时间4-8小时。 要求: 您可以使用任何编辑器(IntelliJ,Eclipse等)。 将项目导入为Maven项目。 您必须具有Maven 3或更高版本 Java 8或更高版本 您可以使用...
以下将详细解析给出的Puzzles。 首先,我们来看Puzzle 66:一件私事。这个谜题涉及到了Java中的继承和成员变量的覆盖(overridden)与隐藏(hidden)。在Java中,方法的覆盖要求子类中的方法至少有与父类相同的访问...
Links:Challenging Puzzle Game Template链接:具有挑战性的益智Unity游戏模板项目源码C# 版本1.2 支持Unity版本2020.1.10或更高 Links 是一款独特且具有挑战性的益智游戏,已准备好发布。 每个级别都会向玩家呈现...
学习编程的好书,推荐哦