检查数字是偶数还是奇数

159

如何确定一个给定的数字是偶数还是奇数?我已经很长时间想弄清楚这个问题,但一直没有头绪。

17个回答

234

你可以使用取模运算符,但这可能会较慢。如果这是一个整数,你可以这样做:

if ( (x & 1) == 0 ) { even... } else { odd... }

这是因为奇数的低位始终为1。


29
我很惊讶人们更喜欢使用取模运算符,而不是简单地检查数字的第一位。显然,如果第一个位被设置了,那么数字一定是奇数。在我看来,这通常更快,并且阅读起来也同样好。我认为,其他人不喜欢使用它而更喜欢使用取模运算符的原因在于缺乏对二进制的理解。 - crush
75
"@crush n % 2 == 0 的语义是“除以2并检查余数是否为0”,比起n & 1 == 0更加清晰,后者的意思为“所有位数都变成0,只有最低位数保持不变,然后检查结果是否为0”。第一个表达式更加清晰,即使可能会有一点点的额外开销。这就是我所说的过早优化。如果某些代码很慢,在那部分进行性能分析,将n % 2改为n & 1是合理的,但提前做这个优化是不必要的。通常在性能分析之前使用位运算符是一个坏主意。" - dtech
19
首先,您的观点完全是主观的。其次,您仍然不了解“过早优化”的含义。它是微小优化,当然。这不是过早的优化。过早优化是在未对现有代码进行剖析以查看其效率低下时即开始修订现有代码中的“优化”。但是,如果已经知道以某种方式编写代码比另一种方式更有效,并选择使用更有效的代码,则不是过早的优化。您的主观意见是 n % 2 == 0n & 1 == 0 更加简洁 - crush
5
如果优化很重要,让我们都回到C语言吧。它比Java运行快40倍...我们可以再次自己完成JAVA为我们完成的所有工作 :-) 对不起,大家别打我,我不得不说这句话 :-) - Lawrence
23
提醒大家,使用取模运算符是可以的。但如果您要用它来测试奇偶性,请写成n % 2 != 0,而不是n % 2 == 1。因为在Java中对于负数,后者无法正常工作。请注意不改变原意,使翻译简明易懂。 - Jxek
显示剩余18条评论

123
if ((x % 2) == 0) {
   // even
} else {
   // odd
}

31

如果你除以2的余数为0,则是偶数。%是获取余数的运算符。


15
% 运算符被称为取模运算符。 - Anthony
4
@Anthony:实际上,这是“余数运算符”(remainder operator)。 - Ryan Stewart
4
数学术语是模数,它的适用范围比取余更广。(A % B)本身可以被用作表达式,这时就很有趣了。 - Stefan Kendall
2
@Stefan:我不想再多说了,但数学家们倾向于指出,在模算术中,模数和余数并不是同一回事。 - Ryan Stewart
2
@StefanKendall 请查看Java语言规范#15.17.3。谷歌不是规范性的参考。 - user207421
显示剩余2条评论

26

求余运算符 % 可以给出被除数除以某个数后的余数。

如果 n % 2 == 0,那么当 n 是偶数时返回真,当 n 是奇数时返回假。


23

每个偶数都可以被2整除,无论它是十进制还是小数(但小数部分如果存在也必须是偶数)。因此您可以使用 %(取模)运算符,它将左边的数字除以右边的数字并返回余数...

boolean isEven(double num) { return ((num % 2) == 0); }

1
“Regardless of if it's a decimal” 是没有意义的。Decimal 是一种基数。你是指 “包含小数部分” 吗? - user207421

8
我推荐阅读《Java Puzzlers:陷阱,问题和边角情况》一书,作者是Joshua Bloch和Neal Gafter。书中简要介绍了如何检查数字是否为奇数。第一种尝试类似于@AseemYadav的方法:
public static boolean isOdd(int i) {
     return i % 2 == 1;
}

但正如书中所提到的:

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

因此,通常情况下,当我们有负奇数时,i%2的结果将不是1而是-1。因此,我们可以使用@Camilo的解决方案或者只需执行以下操作:

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

但通常最快的解决方案是使用AND运算符,就像@lucasmo上面所写的那样:
public static boolean isOdd(int i) {
     return (i & 1) != 0;
}

值得一提的是Math.floorMod(int x, int y);,它处理负被除数很好,但如果除数为负数,则可能会返回-1

4

最低有效位(最右侧)可用于检查数字是偶数还是奇数。 对于所有奇数,在二进制表示中,最右侧的位始终为1。

public static boolean checkOdd(long number){
   return ((number & 0x1) == 1);
}

3

适用于正数或负数

int start = -3;
int end = 6;

for (int val = start; val < end; val++)
{
    // Condition to Check Even, Not condition (!) will give Odd number
    if (val % 2 == 0) 
    {
        System.out.println("Even" + val);
    }
    else
    {
        System.out.println("Odd" + val);
    }
}

2
    /**
     * Check if a number is even or not using modulus operator.
     *
     * @param number the number to be checked.
     * @return {@code true} if the given number is even, otherwise {@code false}.
     */
    public static boolean isEven(int number) {
        return number % 2 == 0;
    }

    /**
     * Check if a number is even or not using & operator.
     *
     * @param number the number to be checked.
     * @return {@code true} if the given number is even, otherwise {@code false}.
     */
    public static boolean isEvenFaster(int number) {
        return (number & 1) == 0;
    }

source


2

下面的程序可以处理大数(数字位数大于20)

package com.isEven.java;
import java.util.Scanner;

public class isEvenValuate{

public static void main(String[] args) {            

        Scanner in = new Scanner(System.in);
        String digit = in.next();

        int y = Character.getNumericValue(digit.charAt(digit.length()-1));

        boolean isEven = (y&1)==0;

        if(isEven)
            System.out.println("Even");
        else
            System.out.println("Odd");

    }
}

这是输出结果:
  122873215981652362153862153872138721637272
  Even

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接