Answers:
对于非负整数,可以使用余数运算符来代替语义略有不同的取模运算符%
。对于您的确切示例:
if ((a % 2) == 0)
{
isEven = true;
}
else
{
isEven = false;
}
可以简化为单线:
isEven = (a % 2) == 0;
%
在查询==
之前,我还不知道该值是多少,因此不清楚该表达式是否等于(a%2)==0
或a%(2==0)
。我猜这在Java中布尔值与整数不同的情况下不太重要
这是用最少的Java代码表示的伪代码;
boolean isEven = a % 2 == 0;
我现在将其分解为各个部分。Java中的模运算符是百分比字符(%)。因此,采用int%int会返回另一个int。双重等于(==)运算符用于比较值,例如一对整数,并返回布尔值。然后将其分配给布尔变量“ isEven”。基于运算符的优先级,将在比较之前评估模量。
由于其他所有人都已经给出了答案,因此我将添加一些其他上下文。%“模数”运算符实际上正在执行余数运算。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的形式),供读者练习。;)
希望能有所帮助。
Java实际上没有C那样的模运算符。Java中的%是余数运算符。在正整数上,它的工作方式与模数完全相同,但是在负整数上的工作方式不同,并且与模数不同,它也可以使用浮点数。尽管如此,在除正整数之外的任何东西上都很少使用%,因此,如果您想将它称为模数,那就放心吧!
array[x mod array.length]
始终访问数组中的元素,而不是尝试索引负位置。
(x % y + y) % y
或从Java 8开始Math.floorMod(x, y)
尽管可以通过检查值是否为负来进行适当的取模,然后将其校正为负(许多人建议的方式),但还有一个更紧凑的解决方案。
(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 );
}
您应该在使用“余数”运算符%之前检查规格:
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);
在Java中,它是%
运算符:
15.17.3。余算符%
请注意,floorMod
在java.lang.Math
类中也将提供%
与带不同符号的参数不同的结果:
%
因为它在参数为负数时也可以正常工作。其他答案中没有一个是真正正确的,因为它们带有以下声明:除非参数为正数,否则%不是真正的模数。特别是如果您想将每个整数映射到数组中的连续位置,那么array[floorMod(i, array.length)
即使索引i
进入负数区域也可以正常工作。并非如此%
。
另外,mod可以这样使用:
int a = 7;
b = a % 2;
b
等于1。因为7 % 2 = 1
。
正如其他人指出的那样,%
(余数)运算符与数学
mod
模运算/函数不同。
mod
与%
该
x mod n
函数映射x
到n
范围内[0,n)
。
而x % n
运算符映射x
到n
的范围(-n,n)
。
为了拥有一种使用数学模运算而不关心前面符号的方法,x
可以使用:
((x % n) + n) % n
也许这张照片有助于更好地理解它(我很难把头放在这上面)
int
变量本身的2 ^ 32模块化。该floorMod
方法可以正确执行此操作(但是如果n
为负,则可能需要其他计算)。
在中Java
,可以按以下方式执行mod操作:
Math.floorMod(a, b)
注:
该MOD操作是从不同的其余操作。在中Java
,其余操作可以这样执行:
a % b
Math.floorMod()
拥有它:The floor modulus is x - (floorDiv(x, y) * y), has the same sign as the divisor y, and is in the range of -abs(y) < r < +abs(y).
因此它与数学模数不完全相同。但是,用相同的方法在Javadoc中也有一种获得肯定结果的方法:If the signs of arguments are unknown and a positive modulus is needed it can be computed as (floorMod(x, y) + abs(y)) % abs(y).
floorMod
操作将按预期进行。还有floorMod
for long
值,否则有BigInteger
更大的值。
@Cody的代码的替代方法:
使用模运算符:
bool isEven = (a % 2) == 0;
我认为这比编写if / else稍好一些,因为重复和未使用的灵活性更少。检查确实需要更多的脑力,但是isEven
补偿的命名很不错。