使用模运算符测试整数的奇怪性

时间:2013-05-17 12:44:27

标签: java modulo

以下代码段不能正确测试奇怪性:

public static boolean isOdd(int i) {
   return i % 2 == 1;
}

我在网上看到我应该采用以下方式:

public static boolean isOdd(int i) {
   return i % 2 != 0;
}

为什么会这样?

6 个答案:

答案 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(%)

根据我们使用的平台和虚拟机,这段代码的运行速度比第一个要快。

注意:-一般而言,相除和余数运算符比其他算术和逻辑运算符慢。