作为伪代码中的一个例子:
if ((a mod 2) == 0)
{
isEven = true;
}
else
{
isEven = false;
}
作为伪代码中的一个例子:
if ((a mod 2) == 0)
{
isEven = true;
}
else
{
isEven = false;
}
当前回答
Java实际上不像C语言那样有模运算符。%在Java中是一个余数运算符。对于正整数,它的工作原理与模运算完全相同,但它对负整数的工作原理不同,与模运算不同,它也可以用于浮点数。不过,除了正整数之外,很少在任何情况下使用%,所以如果您想称其为模,那么请随意!
其他回答
既然其他人都已经给出了答案,我将添加一点额外的上下文。%“模”运算符实际上是在执行余数运算。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
}
第二种方法更好地利用了语言,并产生了更简洁的代码。(不要忘记==运算符返回一个布尔值。)
// 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的形式)重写它是留给读者的练习。,)
在使用'remainder'操作符%之前,您应该检查规范:
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);
虽然可以通过检查值是否为负并纠正它(许多人建议的方法)来进行适当的模运算,但还有一个更紧凑的解决方案。
(a % b + b) % b
这将首先进行模运算,将值限制在-b -> +b范围内,然后加上b以确保值为正,让下一个模运算将其限制在0 -> b范围内。
注:如果b为负数,结果也是负数
在不使用模运算的情况下,代码运行得更快:
public boolean isEven(int a){
return ( (a & 1) == 0 );
}
public boolean isOdd(int a){
return ( (a & 1) == 1 );
}
对于非负整数,可以使用余数运算符%,而不是语义略有不同的模运算符。具体的例子是:
if ((a % 2) == 0)
{
isEven = true;
}
else
{
isEven = false;
}
这可以简化为一行代码:
isEven = (a % 2) == 0;