web-dev-qa-db-ja.com

Javaのmodの構文は何ですか

擬似コードの例としては、

if ((a mod 2) == 0)
{
    isEven = true;
}
else
{
    isEven = false;
}
217
Bob

負でない整数の場合、 剰余 演算子%を使用できます。あなたの正確な例としては:

if ((a % 2) == 0)
{
    isEven = true;
}
else
{
    isEven = false;
}

これはワンライナーに単純化できます。

isEven = (a % 2) == 0;
344
Cody Hatch

これが、最小限のJavaコードで擬似コードを表現したものです。

boolean isEven = a % 2 == 0;

それをそのコンポーネントに分解します。 Javaのモジュラス演算子はパーセント文字(%)です。したがって、int%intをとると、別のintが返されます。 double equals(==)演算子は、一対の整数などの値を比較するために使用され、ブール値を返します。これがブール変数 'isEven'に代入されます。演算子の優先順位に基づいて、モジュラスは比較の前に評価されます。

110
martinatime

他の誰もがすでに答えを出しているので、私はもう少し文脈を追加します。 "モジュラス"演算子は実際には剰余演算を実行しています。 modとremの違いは微妙ですが重要です。

より具体的には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番目のアプローチは完全を期すためのもので、 ternary 演算子を使います。三項演算子が非常に役立つことが多いのですが、この場合は2番目のアプローチが優れていると考えます。

// Option 3: Ternary operator
boolean isEven = ((a % 2) == 0) ? true : false;

4番目のそして最後のアプローチは整数の バイナリ表現の知識を使うことです 。最下位ビットが0の場合、数値は偶数です。これは bitwise-and演算子 (&)を使って確認できます。このアプローチは最速ですが(除算の代わりに単純なビットマスキングを行っています)、初心者にとってはおそらく少し高度/複雑です。

// Option 4: Bitwise-and
boolean isEven = ((a & 1) == 0);

ここではビットごとのand演算子を使い、それをオプション2に示す簡潔な形式で表現しました。オプション1の形式(そしてオプション3の形式)に書き換えることは、読者への課題として残しておきます。 ;)

それが役立つことを願っています。

89
Rob Rolnick

負の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;
}
31
Zom-B

値が負であるかどうかをチェックして適切なモジュロを実行し、正であればそれを修正することは可能ですが(多くの方法が推奨しています)、よりコンパクトな解決策があります。

(a % b + b) % b

これは最初にモジュロを行い、値を-b - > + bの範囲に制限し、次に値が正であることを確認するためにbを追加し、次のモジュロが0 - > bの範囲に制限するようにします。

注:bが負の場合、結果も負になります

12
Stefan T

コードはモジュロを使用せずにはるかに速く実行されます。

public boolean isEven(int a){
    return ( (a & 1) == 0 );
}

public boolean isOdd(int a){
    return ( (a & 1) == 1 );
}
11
michael

Javaには、Cのようにモジュロ演算子がありません。 Javaの%は剰余演算子です。正の整数では、モジュロとまったく同じように機能しますが、負の整数では異なる動作をします。モジュロとは異なり、浮動小数点数でも機能します。それでも、正の整数以外のものに%を使用することはめったにありません。そのため、モジュロと呼びたい場合は、気軽にください。

11
Greg Charles
if (a % 2 == 0) {
} else {
}
6
J D OConal

あなたは '剰余'演算子%を使う前に仕様を調べるべきです:

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);
4
kioto

また、modは次のように使用できます。

int a = 7;
b = a % 2;

bは1になります。7 % 2 = 1

3
jjnguy

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;
}
3
eljenso

別の方法は:

boolean isEven = false;
if((a % 2) == 0)
{
    isEven = true;
}

しかし、最も簡単な方法はまだあります:

boolean isEven = (a % 2) == 0;

@Steve Kuoが言ったように。

1
brothers28

モジュロ演算子は%(パーセント記号)です。均一性をテストしたり、通常は2のべき乗でモジュロを実行するには、isEven =!(a&1)のように&(およびand演算子)を使用することもできます。

1
jjrv

Javaではそれは%演算子です: 15.17.3。剰余演算子%

Java.lang.Mathクラスには floorMod もあります。これは、%とは符号が異なる引数に対して異なる結果になります。

public static int floorMod​(int x, int y)

1
Roland

他の人が指摘したように、%(剰余)演算子は数学的なmodモジュラス演算/関数と同じではありません。

mod vs %

x mod n関数は、x[0,n)の範囲でnにマップします。
これに対して、x % n演算子は、(-n,n)の範囲でxnにマップします。

xの前の符号を気にせずに数学的なモジュラス演算を使用するメソッドを使用するには、次のように使用できます。

((x % n) + n) % n

たぶん、この写真はそれをよりよく理解するのに役立ちます(最初に頭を包むのに苦労しました)

enter image description here

0
m4110c

Javaでは、mod操作を次のように実行できます。

Math.floorMod(a, b)

注:mod操作はremainder操作とは異なります。 Javaでは、remainder操作を次のように実行できます。

a % b
0
Shaun Dashjian