247

作为伪代码中的示例:

if ((a mod 2) == 0)
{
    isEven = true;
}
else
{
    isEven = false;
}
4

17 回答 17

379

对于非负整数,您可以使用余数运算符,而不是语义略有不同的模运算符%。对于您的确切示例:

if ((a % 2) == 0)
{
    isEven = true;
}
else
{
    isEven = false;
}

这可以简化为单行:

isEven = (a % 2) == 0;
于 2008-09-18T05:18:58.177 回答
111

这是用最少的 Java 代码表示的伪代码;

boolean isEven = a % 2 == 0;

我现在将它分解成它的组成部分。Java 中的取模运算符是百分比字符 (%)。因此取一个 int % int 返回另一个 int。双等号 (==) 运算符用于比较值,例如一对整数并返回一个布尔值。然后将其分配给布尔变量“isEven”。根据运算符优先级,模数将在比较之前进行评估。

于 2008-09-18T05:18:33.467 回答
96

由于其他人都已经给出了答案,我将添加一些额外的上下文。% “模数”运算符实际上是在执行余数运算。mod 和 rem 之间的区别很微妙,但很重要。

(-1 mod 2) 通常会给出 1。更具体地说,给定两个整数 X 和 Y,操作 (X mod Y) 倾向于返回 [0, Y) 范围内的值。换句话说,X和Y的模量总是大于等于0,小于Y。

使用“%”或 rem 运算符执行相同的操作会保持 X 值的符号。如果 X 为负,则得到范围内的结果 (-Y, 0]。如果 X 为正,则得到范围 [0, Y) 内的结果。

通常这种细微的区别并不重要。不过,回到您的代码问题,有多种方法可以解决“均匀度”问题。

第一种方法适合初学者,因为它特别冗长。

// Option 1: Clearest way for beginners
boolean isEven;
if ((a % 2) == 0)
{
  isEven = true
}
else
{
  isEven = false
}

第二种方法更好地利用了语言,并导致更简洁的代码。(不要忘记 == 运算符返回一个布尔值。)

// Option 2: Clear, succinct, code
boolean isEven = ((a % 2) == 0);

第三种方法是为了完整性,并使用三元运算符。尽管三元运算符通常非常有用,但在这种情况下,我认为第二种方法更好。

// Option 3: Ternary operator
boolean isEven = ((a % 2) == 0) ? true : false;

第四种也是最后一种方法是使用整数的二进制表示的知识。如果最低有效位为 0,则该数字为偶数。这可以使用按位与运算符(&) 进行检查。虽然这种方法是最快的(您正在做简单的位掩码而不是除法),但对于初学者来说可能有点高级/复杂。

// Option 4: Bitwise-and
boolean isEven = ((a & 1) == 0);

在这里,我使用了按位与运算符,并以选项 2 中所示的简洁形式表示它。以选项 1 的形式(或者选项 3 的形式)重写它作为练习留给读者。;)

希望有帮助。

于 2010-01-15T18:10:03.853 回答
35

要让 Java 的 % (REM) 操作像 MOD 一样用于负 X 和正 Y 值,您可以使用以下方法:

private int mod(int x, int y)
{
    int result = x % y;
    if (result < 0)
    {
        result += y;
    }
    return result;
}

或使用三元运算符(更短,但在某些情况下不可能或效率较低):

private int mod(int x, int y)
{
    int result = x % y;
    return result < 0? result + y : result;
}
于 2010-01-31T14:40:37.173 回答
12

Java 实际上没有像 C 那样的模运算符。Java 中的 % 是余数运算符。在正整数上,它的工作方式与模数完全相同,但对负整数的工作方式不同,并且与模数不同,它也可以处理浮点数。尽管如此,除了正整数之外,很少使用 % ,所以如果你想把它称为模数,那就随意吧!

于 2010-01-15T17:57:45.883 回答
12

虽然可以通过检查值是否为负并纠正它(许多人建议的方式)来进行适当的模运算,但有一个更紧凑的解决方案。

(a % b + b) % b

这将首先进行取模,将值限制在 -b -> +b 范围内,然后添加 b 以确保该值为正,让下一个模将其限制在 0 -> b 范围内。

注意:如果 b 为负,结果也为负

于 2013-09-21T16:58:10.490 回答
11

代码在不使用模数的情况下运行得更快:

public boolean isEven(int a){
    return ( (a & 1) == 0 );
}

public boolean isOdd(int a){
    return ( (a & 1) == 1 );
}
于 2010-10-12T16:48:34.633 回答
6

在 Java 中,它是%运算符: 15.17.3。余数运算符 %

请注意,该类中还有floorMod一个java.lang.Math%具有不同符号的参数不同的结果:

public static int floorMod​(int x, int y)

于 2018-03-04T12:02:04.903 回答
6

正如其他人指出的那样,%(余数)运算符与数学 mod模运算/函数不同。

mod对比%

x mod n函数映射xn的范围内[0,n)
x % n运算符映射xn的范围内(-n,n)

为了有一种方法使用数学模运算而不关心前面的符号,x可以使用:

((x % n) + n) % n

也许这张图片有助于更好地理解它(我首先很难理解这个)

在此处输入图像描述

于 2019-08-17T01:54:44.897 回答
5
if (a % 2 == 0) {
} else {
}
于 2008-09-18T05:18:36.400 回答
4

您应该在使用“余数”运算符 % 之前检查规范:

http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.17.3

// bad enough implementation of isEven method, for fun. so any worse?
boolean isEven(int num)
{
    num %= 10;
    if(num == 1)
       return false;
    else if(num == 0)
       return true;
    else
       return isEven(num + 2);
}
isEven = isEven(a);
于 2011-01-18T15:41:02.147 回答
3

此外,mod 可以这样使用:

int a = 7;
b = a % 2;

b将等于 1。因为7 % 2 = 1.

于 2008-09-18T05:19:56.723 回答
3

Java中的余数运算符is%和模运算符可以表示为

public int mod(int i, int j)
{
  int rem = i % j;
  if (j < 0 && rem > 0)
  {
    return rem + j;
  }
  if (j > 0 && rem < 0)
  {
    return rem + j;
  }
  return rem;
}
于 2010-07-28T15:08:17.843 回答
1

另一种方法是:

boolean isEven = false;
if((a % 2) == 0)
{
    isEven = true;
}

但最简单的方法仍然是:

boolean isEven = (a % 2) == 0;

就像@Steve Kuo 说的。

于 2014-05-12T13:44:21.527 回答
1

Java中,可以这样执行mod操作:

Math.floorMod(a, b)

注意: mod运算余数运算不同。在Java中,余数运算可以这样执行:

a % b
于 2019-07-03T21:13:21.347 回答
-1

模运算符是 %(百分号)。要测试均匀度或通常对 2 的幂进行模运算,您还可以使用 &(and 运算符),例如 isEven = !( a & 1 )。

于 2008-09-18T05:18:35.277 回答
-3

@Cody 代码的替代方案:

使用模运算符:

bool isEven = (a % 2) == 0;

我认为这比编写 if/else 稍微好一点,因为重复和未使用的灵活性更少。它确实需要更多的脑力来检查,但良好的命名可以isEven弥补。

于 2008-09-18T19:19:22.980 回答