26

以下代码片段无法正确测试奇怪性:

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

我在网上读到我应该这样做:

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

为什么是这样?

4

6 回答 6

34

Might be because (i % 2) != 0 works for both positive and negative numbers

于 2013-05-17T12:47:11.390 回答
19

Because when i is negative --> (-1) % 2 == -1

于 2013-05-17T12:46:54.847 回答
12

你应该使用:

(i & 1) != 0

以避免签名问题。

另请注意, using&确保编译器无论多么愚蠢,它都不会尝试使用除法来实现%操作。

于 2013-05-17T12:46:26.153 回答
8

如果将模运算符替换为按位与运算符,则第一个片段将正确工作:

public static boolean isOdd(int i) {
   return (i & 1) == 1;
}
于 2013-05-17T13:03:52.350 回答
6

这与模数在 Java 中的工作方式有关。如果我是否定的,那么答案也是否定的。每个否定输入都将返回 false。

于 2013-05-17T12:50:26.073 回答
1

因为下面的方法在为每个数值参数传递负值、零值和正值时表现正常。

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

如果我们使用上述方法isOdd()性能不会太好,最好使用按位AND operator(&)代替remainder(%)运算符。

 public static boolean isOdd(int i) {
       return (i & 1) != 0;
    }

这段代码运行得更快,这取决于我们使用的平台和虚拟机。

注意:- 作为一般规则,除法和余数运算符比其他算术和逻辑运算符慢。

于 2019-01-05T10:30:41.357 回答