作为伪代码中的一个例子:
if ((a mod 2) == 0) { isEven = true; } else { isEven = false; }
下面是用最少的Java代码表示的伪代码;
boolean isEven = a % 2 == 0;
现在我将把它分解成各个部分。Java中的模运算符是百分比字符(%)。因此,取一个int % int返回另一个int。双等号(==)操作符用于比较值,例如一对int,并返回一个布尔值。然后将其分配给布尔变量'isEven'。根据运算符优先级,在比较之前计算模量。
模运算符是%(百分号)。为了测试均匀性或通常对2的幂进行模运算,你也可以使用&(and运算符)像isEven = !(a &1)。
if (a % 2 == 0) { } else { }
对于非负整数,可以使用剩余部分操作符%,而不是语义略有不同的模运算符。具体的例子是:
%
if ((a % 2) == 0) { isEven = true; } else { isEven = false; }
这可以简化为一行代码:
isEven = (a % 2) == 0;
另外,mod可以这样使用:
int a = 7; b = a % 2;
b将等于1。因为7 % 2 = 1。
b
7 % 2 = 1
来自@Cody的代码的替代方案:
使用模运算符:
bool isEven = (a % 2) == 0;
我认为这是比写if/else更好的代码,因为有更少的重复&未使用的灵活性。它确实需要更多的脑力来检查,但isEven的良好命名弥补了这一点。
isEven
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,则该数字为偶数。可以使用bitwise-and运营商 (&)检查。虽然这种方法是最快的(你做的是简单的位屏蔽而不是除法),但对于初学者来说可能有点高级/复杂。
// Option 4: Bitwise-and boolean isEven = ((a & 1) == 0);
这里我使用了位与操作符,并以选项2所示的简洁形式表示它。以选项1的形式(或者选项3的形式)重写它是留给读者的练习。;)
希望这能有所帮助。
为了让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; }
Java中的余数操作符是%,取模操作符可以表示为
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; }
在不使用模运算的情况下,代码运行得更快:
public boolean isEven(int a){ return ( (a & 1) == 0 ); } public boolean isOdd(int a){ return ( (a & 1) == 1 ); }
在使用'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为负数,结果也是负数
另一种方法是:
boolean isEven = false; if((a % 2) == 0) { isEven = true; }
但最简单的方法仍然是:
boolean isEven = (a % 2) == 0;
就像郭怡广说的。
注意,在java.lang.Math类中还有floorMod,对于具有不同符号的参数,它将给出与%不同的结果:
java.lang.Math
floorMod
public static int floorMod(int x, int y)
在Java中,国防部操作可以这样执行:
Java
Math.floorMod(a, b)
<强>注意: 国防部操作不同于剩余部分操作。在Java中,剩余部分操作可以这样执行:
a % b
mod
mod vs % x mod n函数将x映射到[0,n)范围内的n 而x % n操作符将x映射到(-n,n)范围内的n
x mod n函数将x映射到[0,n)范围内的n 而x % n操作符将x映射到(-n,n)范围内的n
x mod n
x
[0,n)
n
x % n
(-n,n)
为了有办法用数学模运算而不是 如果关心x前面的符号,可以使用:
((x % n) + n) % n
也许这张图有助于更好地理解它(我一开始很难理解它)