以下代码段不能正确测试奇怪性:
public static boolean isOdd(int i) {
return i % 2 == 1;
}
我在网上看到我应该采用以下方式:
public static boolean isOdd(int i) {
return i % 2 != 0;
}
为什么会这样?
答案 0 :(得分:34)
可能因为(i % 2) != 0
适用于正数和负数
答案 1 :(得分:19)
因为当i
为负时 - > (-1) % 2 == -1
答案 2 :(得分:12)
您应该使用:
(i & 1) != 0
避免签署问题。
另请注意,使用&
可确保编译器无论多么愚蠢,永远不会尝试使用除法来实现%
操作。
答案 3 :(得分:8)
如果将模运算符替换为按位运算符,则第一个代码段将正常工作:
public static boolean isOdd(int i) {
return (i & 1) == 1;
}
答案 4 :(得分:6)
这与modulo在Java中的工作方式有关。如果我是否定的,答案也将是否定的。每个负面输入都将返回false。
答案 5 :(得分:1)
由于以下方法在为每个数值参数传递负值,零值和正值时会正常工作。
public static boolean isOdd(int i) {
return i % 2 != 0;
}
如果我们使用上述方法isOdd()
的效果不太好,最好使用按位 AND operator(&)
代替 {{1} } 运算符。
remainder(%)
根据我们使用的平台和虚拟机,这段代码的运行速度比第一个要快。
注意:-一般而言,相除和余数运算符比其他算术和逻辑运算符慢。