作为伪代码示例:
if ((a mod 2) == 0)
{
isEven = true;
}
else
{
isEven = false;
}
对于非负整数,您可以使用%
余数运算符,而不是具有略微不同语义的模运算符。针对您的确切示例:
if ((a % 2) == 0)
{
isEven = true;
}
else
{
isEven = false;
}
这可以简化为一行代码:
isEven = (a % 2) == 0;
以下是您的伪代码用最简单的Java代码表示:
boolean isEven = a % 2 == 0;
现在我将把它分解成其组成部分。Java中的模运算符是百分号(%)。因此,对整数进行取模运算(int % int)会返回另一个整数。双等号(==)运算符用于比较值,例如一对整数,并返回布尔值。然后将其赋值给布尔变量“isEven”。基于运算符优先级,在比较之前会计算取模运算。
// 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);
第三种方法是为了完整性而存在的,使用ternary运算符。虽然三元运算符通常非常有用,但在这种情况下,我认为第二种方法更优。
// Option 3: Ternary operator
boolean isEven = ((a % 2) == 0) ? true : false;
// Option 4: Bitwise-and
boolean isEven = ((a & 1) == 0);
这里我使用了按位与运算符,并以选项2中显示的简洁形式表示。将其重写为选项1(或选项3)的形式留给读者作为练习。;)
boolean isEven = (a & 1) == 0;
。我也想澄清一下我们正在进行位操作,如下所示:boolean isEven = (a & 0x1) == 0;
虽然这是个人口味的问题;-) - Hummeling Engineering BV要使Java的%(REM)运算像对于负X和正Y值的MOD一样工作,您可以使用以下方法:
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;
}
虽然可以通过检查值是否为负并在需要时进行修正(许多人建议的方法)来执行正确的模运算,但有一种更紧凑的解决方案。
(a % b + b) % b
它将首先执行模运算,将值限制在 -b -> +b 范围内,然后添加 b 以确保该值为正数,接下来的模运算将其限制在 0 -> b 范围内。
注意:如果 b 是负数,则结果也将是负数。
Java中实际上没有像C语言那样的模运算符,%在Java中是一个余数运算符。对于正整数,它的工作方式与模运算完全相同,但对于负整数,它的工作方式不同,并且与模运算不同,它还可以使用浮点数。尽管如此,在任何情况下,使用%除了正整数以外的其他内容都很少见,因此,如果您想称其为模运算符,那么请随意!
array[x mod array.length]
总是访问我的数组中的一个元素,而不是尝试索引负位置。 - Kris(x % y + y) % y
可以翻译为“将 x 除以 y 的余数加上 y 再对 y 取模”,在 Java 8 中可以使用 Math.floorMod(x, y)
来实现相同的结果。 - Greg Charles不使用模运算会使代码运行速度更快:
public boolean isEven(int a){
return ( (a & 1) == 0 );
}
public boolean isOdd(int a){
return ( (a & 1) == 1 );
}
%
运算符:15.17.3. Remainder Operator %
请注意,在java.lang.Math
类中还有floorMod
方法,对于不同符号的参数,其结果与%
不同:
public static int floorMod(int x, int y)
array[floorMod(i,array.length)
即使索引i
进入负值领域,也可以正确地工作。但是%就不行。 - Krisif (a % 2 == 0) {
} else {
}
== 0
之前要在括号中放置a % 2
? - nl-x%
操作符会在==
操作符之前被计算,所以这个表达式是否等价于(a%2)==0
或a%(2==0)
是不清楚的。我猜在 Java 中这个问题不太重要,因为布尔型和整型不同。 - Matthew Sainsbury