回答:
代わりに、わずかに異なる意味を持つ剰余演算子の、非負整数のために、あなたが使用することができる剰余演算子を%
。あなたの正確な例について:
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を返します。より具体的には、2つの整数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
}
2番目のアプローチは、言語の利点を生かして、より簡潔なコードにつながります。(==演算子がブール値を返すことを忘れないでください。)
// Option 2: Clear, succinct, code
boolean isEven = ((a % 2) == 0);
3番目のアプローチは完全を期するためにここにあり、三項演算子を使用します。三項演算子は非常に便利ですが、この場合は2番目の方法が優れていると考えています。
// Option 3: Ternary operator
boolean isEven = ((a % 2) == 0) ? true : false;
4番目の最後のアプローチは、整数のバイナリ表現の知識を使用することです。最下位ビットが0の場合、数値は偶数です。これは、ビットごとのAND演算子(&)を使用して確認できます。このアプローチは最速ですが(除算の代わりに単純なビットマスキングを行っています)、初心者にはおそらく少し高度で複雑です。
// Option 4: Bitwise-and
boolean isEven = ((a & 1) == 0);
ここでは、ビットごとのAND演算子を使用し、オプション2に示す簡潔な形式で表現しました。オプション1の形式(またはオプション3の形式)でそれを書き換えることは、読者への課題として残されています。;)
お役に立てば幸いです。
負のXおよび正のY値に対してJavaの%(REM)操作を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;
}
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が負の場合、結果も負になります
コードはmoduloを使用せずにはるかに高速に実行されます。
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);
Javaではそれがある%
:オペレーター
15.17.3。剰余演算子%
存在することに注意してくださいfloorMod
でjava.lang.Math
は異なる結果を与えるクラス%
符号の異なる引数のを:
%
引数が負の場合にも適切に機能するため、floorModは「modulo」演算子よりも優れているため、賛成です。他の答えはどれも、引数が正でない限り、%は実際には剰余ではないという免責事項が付いているため、実際には正しくありません。特に、すべての整数を配列内の連続した位置にマッピングする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
代償の適切なネーミングです。