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

cas*_*out 27 java modulo

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

public static boolean isOdd(int i) {
   return i % 2 == 1;
}
Run Code Online (Sandbox Code Playgroud)

我在网上看到我应该通过以下方式做到:

public static boolean isOdd(int i) {
   return i % 2 != 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么是这样?

Sto*_*lly 34

可能因为(i % 2) != 0正数和负数都有效

  • 我不怀疑你,@ GrijeshChauhan,但我发现它更容易使用(),所以我不必记住所有运算符优先规则在我生命中学到的所有语言中的含义!我认为它也有助于提高可读性,因为它消除了与我处于同一位置的人的任何疑问:-). (30认同)
  • 很好的答案但是`()`是多余的,因为[运算符优先级说](http://bmanolov.free.fr/javaoperators.php)我的意思是你可以忽略它 (3认同)

joh*_*902 19

因为什么时候i是否定的 - >(-1) % 2 == -1


Old*_*eon 12

你应该使用:

(i & 1) != 0
Run Code Online (Sandbox Code Playgroud)

避免签署问题.

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

  • @GradyPlayer"会"非常强大; 数据或它没有发生.一个快速测试表明Debian在AMD64上的GCC 4.4.5为`(i&1)!= 0`和`(i%2)!= 0`产生*相同的*汇编.`#include <stdio.h> int main(void){volatile int i = 1; volatile int j =(i&1)!= 0; printf("%d",j); 返回j; }`(和`i%2`而不是`i&1`相同).`cc -S`和`diff -u`表示*only*区别是`.file`指令(因为我为每个指定了一个文件). (3认同)
  • `i%1`始终为0. (2认同)
  • 我不知道java,但在C(i&1)也会更快... (2认同)
  • @GradyPlayer:-O0基本上意味着没有优化.哪个适合调试,但选择它作为基准测试的基线是......至少可以说是有问题的. (2认同)

dev*_*ull 8

如果将模运算符替换为按位运算符,则第一个代码段将正常工作:

public static boolean isOdd(int i) {
   return (i & 1) == 1;
}
Run Code Online (Sandbox Code Playgroud)


小智 6

这与modulo在Java中的工作方式有关.如果我是否定的,答案也将是否定的.每个负面输入都将返回false.