检查数字是偶数还是奇数

Jos*_*osh 119 java

我如何确定给定数字是偶数还是奇数?我一直想要解决这个问题很长一段时间并没有得到任何结果.

luc*_*smo 192

您可以使用模数运算符,但这可能很慢.如果它是一个整数,你可以这样做:

if ( (x & 1) == 0 ) { even... } else { odd... }
Run Code Online (Sandbox Code Playgroud)

这是因为低位将始终设置为奇数.

  • @crush`n%2 == 0`在语义上意味着`除以2并检查余数是否为0`,这比"n&1 == 0"更清晰,这意味着"将所有位置零但保留最低位"位未更改并检查结果是否为0`.第一个改进的清晰度值得(可能不存在)开销.这就是我过早优化的意思.如果某些东西很慢并且你在那个部分中对它进行分析,那么将"n%2"更改为"n&1"肯定是合理的,但事先不这样做.一般来说,在进行性能分析之前使用位运算符是一个坏主意. (52认同)
  • 我有一个编译错误,除非我使用`if((x&1)== 0)...`. (34认同)
  • 令人惊讶的是,人们更喜欢模数而不是简单地检查数字的第一位.显然,如果设置了第一位,则该数字必须为奇数.它通常更快,在我看来也是如此.我认为其他人不喜欢它而不是模数的原因归结为缺乏对二元的理解. (21认同)
  • @dtech首先,你的意见是完全主观的.其次,你仍然不明白"过早优化"是什么意思.肯定是微观优化.这不是一个不成熟的优化.过早优化是使用"优化"修改现有代码,而不首先分析现有代码以查看它是低效的.但是,事先知道以一种方式编写代码与另一种方式编写代码更有效,并且选择使用更高效的代码,并非过早优化.你的主观意见是'n%2 == 0`是*清洁*而不是'n&1 == 0`. (17认同)
  • 我想指出那些来到这里使用模运算符的人很好,但如果你用它来测试奇数,写n%2!= 0,而不是n%2 == 1,因为后者不适用于Java中的负数. (13认同)
  • @dtech我认为你误解了过早优化的含义.如果您事先知道一种方法比另一种方法更高效,那么使用性能更高的方法并不是过早优化.这很聪明.也就是说,我的评论更多的是关于在简单地检查偶数/奇数时如何检查第一位比使用模数更合乎逻辑.问题是许多程序员不理解这两种方法的作用,只是按照教程. (5认同)
  • @dtech从不_assume_你的编译器比你聪明.因为事实证明,在这种情况下,事实并非如此.如果您实际查看了程序集,在这种情况下进行一些检查需要的指令少于mod检查.请参阅顶部答案和评论>>> http://stackoverflow.com/questions/16969220/what-is-the-most-efficent-way-to-detect-even-numbers-in-java (4认同)
  • 如果优化是那么重要,让我们全部回到C.运行速度比Java快40倍...我们可以再次做JAVA为我们做的一切,我们自己:-)对不起家伙不要杀我不得不说: - ) (4认同)
  • 有趣的,最高投票的回答有41个upvotes,它甚至没有编译. (4认同)
  • @crush编译器/ JVM(可能)足够聪明,可以优化"N%2".过早优化是万恶之源...... (2认同)
  • @dtech任何一个以2为底的知识的人都会很清楚地理解`n&1 == 0'正在检查偶数。我喜欢您如何尝试使`n&1 == 0'听起来比实际复杂得多和令人费解。说实话。“ n&1 == 0”在第一位进行按位与运算。当您有x%n个场景时,模数会发光。 (2认同)
  • @Lawrence 如果你还没有看到任何,我想你没有看过像 [this](http://scribblethink.org/Computer/javaCbenchmark.html) 这样的实际基准测试,结合了几个结果。尽管标题引用了几个 C 示例。 (2认同)

poy*_*poy 93

if((x%2)==0)
   // even
else
   // odd
Run Code Online (Sandbox Code Playgroud)


Rya*_*art 27

如果除以2时的余数为0,则为偶数.%得到剩余的是运营商.

  • %运算符称为模数. (11认同)
  • @Anthony:实际上,它是["余数运算符"](http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.17.3). (4认同)
  • 数学术语是模数,它具有比获得余数更广泛的适用性.`(A%B)`本身可以用作表达式,这就是事情变得有趣的时候. (2认同)
  • @Stefan:我不会说明这一点,但数学家倾向于指出[模块化算法](http://en.wikipedia.org/wiki/Modular_arithmetic)模数和余数[不是一回事](http://mathforum.org/library/drmath/view/54363.html). (2认同)
  • @StefanKendall检查[Java语言规范#15.17.3](http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.17.3)。Google不是规范性参考。 (2认同)

Phi*_*hil 24

余数运算符%将在除以数字后给出余数.

所以,n % 2 == 0当n为偶数和虚假如果n是奇数将是真实的.


fir*_*w52 20

每个偶数都可以被2整除,无论它是否为小数(但小数,如果存在,也必须是偶数).所以你可以使用%(modulo)运算符,它将左边的数字除以右边的数字并返回余数......

boolean isEven(double num) { return ((num % 2) == 0); }
Run Code Online (Sandbox Code Playgroud)


Mic*_*u93 7

我会推荐

Java Puzzlers: Traps, Pitfalls, and Corner Cases 书籍 Joshua Bloch 和 Neal Gafter

有一个简单的解释如何检查数字是否为奇数。第一次尝试与@AseemYadav 尝试过的类似:

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

但正如书中提到的:

当余数运算返回非零结果时,它的符号与其左操作数相同

所以一般当我们有负奇数然后代替1我们会得到-1的结果i%2。所以我们可以使用@Camilo 解决方案或只是这样做:

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

但通常最快的解决方案是使用 AND 运算符,如上面写的@lucasmo:

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

@Edit 还值得指出的是Math.floorMod(int x, int y);,它可以很好地处理负的红利,但-1如果除数为负也可以返回