java中mod的语法是什么?

Bob*_*Bob 225 java modulo

作为伪代码的一个例子:

if ((a mod 2) == 0)
{
    isEven = true;
}
else
{
    isEven = false;
}
Run Code Online (Sandbox Code Playgroud)

Cod*_*tch 348

对于非负整数,可以使用余数运算符%.您的确切示例:

if ((a % 2) == 0)
{
    isEven = true;
}
else
{
    isEven = false;
}
Run Code Online (Sandbox Code Playgroud)

这可以简化为单行:

isEven = (a % 2) == 0;
Run Code Online (Sandbox Code Playgroud)

  • if/else是不必要的,只需使用isEven =(a%2)== 0, (78认同)
  • 注意术语mod和模块,因为n(mod m)总是> = 0但不是n%m.n%m在> -m和<m的范围内.虽然Java有int和long类型的余数运算符,但它没有模数函数或运算符.即,-12%10 = -2而-12 mod 10 = 8.如果%运算符返回n%m的负值,则(n%m)+ m将给出n mod m.BigInteger为两者提供功能,并且它们的规格很好地解释了差异.另外,小心零.在数学中,虽然零是偶数,但它不是正数或负数. (56认同)
  • 这不是模数运算符 - 它是余数运算符.请更正帖子! (7认同)
  • @ nl-x可能是因为最好明确优先权而不是将其留给惯例.我一个人不知道`%`在我查找之前在'=='之前被评估,所以不清楚表达式是否相当于`(a%2)== 0`或'a%(2 == 0)`.我想在布尔值与整数不同的java中不太重要 (4认同)
  • boolean even =((a&1)== 0).更容易. (2认同)

mar*_*ime 110

以下是最小Java代码中伪代码的表示;

boolean isEven = a % 2 == 0;
Run Code Online (Sandbox Code Playgroud)

我现在将其分解为其组件.Java中的模数运算符是百分比字符(%).因此,获取int%int将返回另一个int.double equals(==)运算符用于比较值,例如一对int并返回一个布尔值.然后将其分配给布尔变量'isEven'.根据运算符优先级,将在比较之前评估模数.

  • 最小的没有括号;) (12认同)
  • 它是余数运算符,而不是模数运算符. (3认同)

Rob*_*ick 92

由于其他人已经给出了答案,我将添加一些额外的背景.%"模数"运算符实际上执行余数运算.mod和rem之间的区别很微妙,但很重要.

(-1 mod 2)通常给出1.更具体地说,给定两个整数X和Y,操作(X mod Y)倾向于返回[0,Y]范围内的值.换句话说,X和Y的模数总是大于或等于零,并且小于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
}
Run Code Online (Sandbox Code Playgroud)

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

// Option 2: Clear, succinct, code
boolean isEven = ((a % 2) == 0);
Run Code Online (Sandbox Code Playgroud)

第三种方法是完整性,并使用三元运算符.虽然三元运算符通常非常有用,但在这种情况下,我认为第二种方法更优越.

// Option 3: Ternary operator
boolean isEven = ((a % 2) == 0) ? true : false;
Run Code Online (Sandbox Code Playgroud)

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

// Option 4: Bitwise-and
boolean isEven = ((a & 1) == 0);
Run Code Online (Sandbox Code Playgroud)

在这里,我使用了bitwise-and运算符,并以选项2中显示的简洁形式表示它.在选项1的表单中重写它(以及选项3的表单)作为练习留给读者.;)

希望有所帮助.

  • 将选项4置于极端,boolean isEven =!(a&1),返回与a是否是奇数的相反,其中a = 1 == 1(真).当然,这就是那种使代码难以理解的编码器技巧.;) (4认同)

小智 32

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

private int mod(int x, int y)
{
    int result = x % y;
    if (result < 0)
    {
        result += y;
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

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

private int mod(int x, int y)
{
    int result = x % y;
    return result < 0? result + y : result;
}
Run Code Online (Sandbox Code Playgroud)


Ste*_*n T 12

虽然可以通过检查值是否为负值来进行正确的模数,如果是(正如许多人所建议的那样),则可以更正它,但是有一个更紧凑的解决方案.

(a % b + b) % b
Run Code Online (Sandbox Code Playgroud)

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

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


Gre*_*les 11

Java实际上没有C语言的模运算符.Java中的%是余数运算符.在正整数上,它的工作方式与模数完全相同,但它在负整数上的工作方式不同,与模数不同,它也可以用于浮点数.尽管如此,除了正整数之外,很少使用%,所以如果你想把它称为模数,那么请随意!

  • `(x % y + y) % y` 或从 Java 8 开始,`Math.floorMod(x, y)` (2认同)

小智 11

不使用modulo,代码运行得更快:

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

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

  • 过早优化多少? (4认同)
  • @LluisMartinez这是计算中最错误的说法之一.完整的报价是"程序员浪费大量的时间思考,也不必担心,他们的节目非关键部分的速度,而这些尝试的效率实际上有一个强烈的负面影响时,调试和维护的考虑.我们应该忘记小效率,大约97%的时间说:过早的优化是所有邪恶的根源.然而,我们不应该把关键的3%的机会放弃." 这实际上意味着完全不同的东西 (4认同)
  • 这看起来比接受的答案要清晰得多.这与过早优化无关.它更好, - 如果它的工作原理. (3认同)
  • @EJP你可能是对的.我做了一个测试(循环有100万次迭代),模数为4000纳秒,逻辑和为2500纳秒. (3认同)

m41*_*10c 6

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

mod 对比 %

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

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

((x % n) + n) % n
Run Code Online (Sandbox Code Playgroud)

也许这张图片有助于更好地理解它(我第一次很难理解它)

在此处输入图片说明

  • 画得不错。另一种复杂性:这没有考虑 `int` 变量本身的 2^32 模块化。`floorMod` 方法确实正确地做到了这一点(但如果 `n` 为负数,您可能需要额外的计算)。 (2认同)

Rol*_*and 5

在 Java 中,它是%运算符: 15.17.3。剩余操作员 %

请注意,也有floorModjava.lang.Math这将给来自不同的结果类%的符号不同的参数:

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

  • 赞成,因为 FloorMod 是比“%”更好的“模”运算符,因为当参数为负数时它也能正常工作。其他答案都不是真正正确的,因为它们附带了免责声明,除非参数是肯定的,否则 % 并不是真正的模数。特别是如果你想将每个整数映射到数组中的连续位置,那么即使索引“i”进入负值,“array[floorMod(i, array.length)”也可以正常工作。对于“%”则不然。 (2认同)