以下代码片段无法正确测试奇怪性:
public static boolean isOdd(int i) {
return i % 2 == 1;
}
我在网上读到我应该这样做:
public static boolean isOdd(int i) {
return i % 2 != 0;
}
为什么是这样?
Might be because (i % 2) != 0
works for both positive and negative numbers
Because when i
is negative --> (-1) % 2 == -1
你应该使用:
(i & 1) != 0
以避免签名问题。
另请注意, using&
确保编译器无论多么愚蠢,它都不会尝试使用除法来实现%
操作。
如果将模运算符替换为按位与运算符,则第一个片段将正确工作:
public static boolean isOdd(int i) {
return (i & 1) == 1;
}
这与模数在 Java 中的工作方式有关。如果我是否定的,那么答案也是否定的。每个否定输入都将返回 false。
因为下面的方法在为每个数值参数传递负值、零值和正值时表现正常。
public static boolean isOdd(int i) {
return i % 2 != 0;
}
如果我们使用上述方法isOdd()
性能不会太好,最好使用按位AND operator(&)
代替remainder(%)
运算符。
public static boolean isOdd(int i) {
return (i & 1) != 0;
}
这段代码运行得更快,这取决于我们使用的平台和虚拟机。
注意:- 作为一般规则,除法和余数运算符比其他算术和逻辑运算符慢。