Javaで%演算子を使いこなす9つの方法

Javaの%演算子を解説する記事のサムネイルJava
この記事は約15分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Javaを学び始めた方、あるいは久しぶりにプログラミングに触れる方にとって、%演算子は少し謎めいているかもしれません。

しかし、この記事を読むことで、%演算子の使い方が完全に理解できるでしょう。

9つの使い方とその対処法、カスタマイズ方法まで、ここで解説します。

●%演算子とは

○基本の説明

%演算子とは、Javaにおいて「剰余(余り)」を計算するための演算子です。

具体的には、2つの数AとBがあった場合、A % Bと書くことでAをBで割った余りが得られます。

例: 10 % 3 は、10を3で割った余り、つまり1になります。

○主な用途

%演算子は多くの場面で役立ちます。

  1. 偶数・奇数の判定
  2. 配列やリストの要素に循環的にアクセス
  3. 高度な算術計算やデータ処理
  4. ゲームプログラミングでの状態管理
  5. ハッシュ関数の計算

これらの他にも多様な用途に対応する具体的なコード例と解説をこれから紹介します。

●%演算子の基本的な使い方

さて、前の章で%演算子の基礎知識について理解できたと思います。

ここからは実際のコードを通して、どのように%演算子が使われるのか詳しく見ていきましょう。

○サンプルコード1:剰余を求める基本的な使い方

%演算子の一番基本的な使い方は「剰余(余り)を求める」ことです。

こちらがその基本的なコードです。

public class Main {
  public static void main(String[] args) {
    // 10を3で割った余りを計算
    int result = 10 % 3;
    System.out.println("10を3で割った余りは " + result);
  }
}

このコードでは、10 % 3という式で、10を3で割った余りを計算しています。

そしてその結果を変数resultに格納し、出力しています。

このコードを実行すると、コンソールには「10を3で割った余りは 1」と表示されます。

○サンプルコード2:偶数・奇数を判定する

%演算子は偶数と奇数を簡単に判定する場面でもよく用います。

public class Main {
  public static void main(String[] args) {
    int num = 5;
    // 偶数か奇数かを判定
    if (num % 2 == 0) {
      System.out.println(num + "は偶数です。");
    } else {
      System.out.println(num + "は奇数です。");
    }
  }
}

この例では、変数numの値が偶数か奇数かを判定しています。

num % 2が0であれば偶数、そうでなければ奇数と判断しています。このコードを実行すると「5は奇数です。」と出力されます。

○サンプルコード3:ループでの利用例

%演算子はループ処理で頻繁に使われます。

例えば、一定回数ごとに何らかの処理を行いたい場合などです。

public class Main {
  public static void main(String[] args) {
    // 0から9までの数字を出力、ただし3の倍数の時だけ後に"(3の倍数)"と出力
    for (int i = 0; i <= 9; i++) {
      System.out.print(i);
      if (i % 3 == 0) {
        System.out.print("(3の倍数)");
      }
      System.out.println();
    }
  }
}

このコードを実行すると、0から9までの数が出力され、3の倍数(0、3、6、9)の時だけ後ろに”(3の倍数)”と出力されます。

このように、%演算子を使って一定の条件に合致する場合だけ特定の処理を行う、といった使い方が一般的です。

●%演算子の高度な使い方

基本的な使い方をマスターしたら、次は高度なテクニックに挑戦しましょう。

%演算子は初見で単純に見えますが、プログラミングの多様な場面でその真価を発揮します。

○サンプルコード4:配列の要素に循環的にアクセスする

配列やリストに保存された要素に循環的にアクセスする際にも%演算子が活躍します。

public class Main {
    public static void main(String[] args) {
        String[] colors = {"赤", "青", "緑", "黄", "紫"};
        // 8回色を出力。ただし、5個しかないため循環させる
        for (int i = 0; i < 8; i++) {
            // 配列の要素数で割った余りをインデックスとする
            String color = colors[i % colors.length];
            System.out.println(color);
        }
    }
}

このサンプルでは、5つの要素からなる文字列型の配列colorsがあります。

この配列を利用して、8回色を出力しています。

i % colors.lengthという式で、インデックスが配列の要素数以上になった場合には余りをインデックスとして利用することで、要素に循環的にアクセスしています。

このコードを実行すると、「赤、青、緑、黄、紫、赤、青、緑」という風に出力されます。

○サンプルコード5:高速な計算を行う

%演算子は剰余を高速に計算できるため、計算速度が重要な場面でよく用いられます。

特に、2の冪乗で割り算をする場合には、ビット演算と組み合わせて非常に高速な計算が可能です。

public class Main {
    public static void main(String[] args) {
        int num = 1000;
        // 2の6乗(64)で割る。高速な計算方法
        int fastResult = num & (64 - 1);
        System.out.println("高速な計算結果:" + fastResult);
    }
}

この例では、1000を2の6乗(64)で割る計算を行っています。

通常、このような計算はnum % 64と記述できますが、num & (64 - 1)とビット演算を使って計算することで、高速に結果を得ることができます。

このコードを実行すると、「高速な計算結果:56」と表示されます。

ちなみに、通常の%演算子を用いた場合と結果は同じになります。

●%演算子の注意点と対処法

%演算子は非常に便利なツールですが、その使用にはいくつか注意すべきポイントがあります。

特に初心者が陥りやすいトラブルをいくつか取り上げ、それに対する解決策を示します。

○サンプルコード6:負の数での剰余

Javaで負の数に%演算子を適用すると、結果も負になる可能性があります。

これは予期しない挙動につながることがあり、注意が必要です。

public class Main {
    public static void main(String[] args) {
        int negativeNum = -10;
        int divisor = 3;
        // 負の数で剰余を取る
        int result = negativeNum % divisor;
        System.out.println("負の数での剰余:" + result);
    }
}

このコードでは、-10を3で割った余りを計算しています。

計算結果は-1となり、これは多くの人にとって直感的でないかもしれません。

一般的に、剰余は0以上であると思われがちですが、Javaでは被除数が負の場合、剰余も負になる可能性がある点を把握してください。

実行すると「負の数での剰余:-1」と表示されます。

○サンプルコード7:0で割ると発生する例外とその対処法

0で数を割ることは数学的に無意味です。

同様に、Javaで0で割ると例外が発生します。

public class Main {
    public static void main(String[] args) {
        try {
            int num = 10;
            int divisor = 0;
            // 0で割る
            int result = num % divisor;
            System.out.println("0で割った結果:" + result);
        } catch (ArithmeticException e) {
            System.out.println("0で割ることはできません");
        }
    }
}

上記のコードは、10を0で割ろうとしています。

この操作はJavaではArithmeticExceptionを投げるため、try-catchブロックで例外を補足しています。

このコードを実行すると、「0で割ることはできません」と表示され、プログラムは安全に終了します。

●%演算子のカスタマイズ方法

Javaで%演算子を使う際に、特定のニーズに応じてカスタマイズしたい場合があります。

ここではそのようなカスタマイズ方法について説明します。

○サンプルコード8:自作の剰余計算関数を作る

Javaの%演算子が負の数に対して特有の挙動を表すことは前述しましたが、常に正の剰余を返すような自作の剰余計算関数を作ることも可能です。

public class CustomModulus {
    public static void main(String[] args) {
        // 自作のmod関数を用いて計算
        int result = customMod(-10, 3);
        System.out.println("自作のmod関数での結果:" + result);
    }

    // 常に正の剰余を返すmod関数
    public static int customMod(int x, int y) {
        int remainder = x % y;
        if (remainder < 0) {
            return remainder + y;
        }
        return remainder;
    }
}

このコードではcustomModというメソッドを作成し、その中で%演算子を使用しています。

ただし、計算結果が負の場合には除数を加算して正の剰余を返すようにしています。

このコードを実行すると、出力される結果は「自作のmod関数での結果:2」となり、正の剰余が得られます。

○サンプルコード9:BigIntegerクラスで大きな数値を扱う

Javaの標準的な数値型では扱えない非常に大きな数値に対する剰余計算も必要な場合があります。

そのような場合、JavaのBigIntegerクラスを用いることができます。

import java.math.BigInteger;

public class BigModulus {
    public static void main(String[] args) {
        BigInteger bigNum = new BigInteger("123456789012345678901234567890");
        BigInteger divisor = new BigInteger("12345");
        // BigIntegerを用いた剰余計算
        BigInteger result = bigNum.mod(divisor);
        System.out.println("BigIntegerでの剰余:" + result);
    }
}

上記のコードは、非常に大きな数値に対して剰余を計算しています。

BigIntegerクラスのmodメソッドを使用することで、通常の%演算子が扱える範囲を超えた大きな数値に対しても剰余計算が可能です。

このコードを実行すると、出力される結果は「BigIntegerでの剰余:数値」となり、BigIntegerクラスを使用して正確に剰余が計算されます。

●%演算子の応用例

%演算子は単なる剰余を求める道具以上に、多くのプログラミングの場面で応用されます。

ここでは特にゲームプログラミングとデータ構造でのその利用例を解説します。

○ゲームプログラミングでの利用

ゲームプログラミングでは、周期的な動きやリソースの再利用などで%演算子がよく使われます。

たとえば、スプライト(2Dのキャラクター画像)が画面端に到達したら反対側から再出現させるケースを考えましょう。

public class GameExample {
    public static void main(String[] args) {
        int screenWidth = 800;
        int spritePositionX = 810; // 画面外(右端)の位置

        // 画面端に到達したら反対側から再出現
        spritePositionX = spritePositionX % screenWidth;

        System.out.println("新しいスプライトの位置(X座標): " + spritePositionX);
    }
}

このJavaコードでは、screenWidthが画面の幅、spritePositionXがスプライトのX座標としています。

%演算子を用いることで、スプライトが画面外に出た場合に画面内に戻す処理が可能です。

コードを実行すると、新しいスプライトの位置(X座標)が10と出力され、意図通りの動作となります。

○データ構造での活用

%演算子は、データ構造の中でも特に「ハッシュテーブル」でよく用いられます。

ハッシュテーブルは、キーと値のペアを高速に保存・検索するデータ構造であり、ハッシュ関数と呼ばれる関数を用いて、どの位置にデータを保存するかを決定します。

このハッシュ関数の計算で%演算子が使われることが一般的です。

import java.util.HashMap;

public class HashTableExample {
    public static void main(String[] args) {
        // ハッシュテーブルの作成
        HashMap<Integer, String> hashMap = new HashMap<>();

        // データの保存
        hashMap.put(10, "Apple");
        hashMap.put(21, "Banana");
        hashMap.put(32, "Cherry");

        // ハッシュ値の計算とデータの取得
        int hashCode = 21;
        int arraySize = 16; // ハッシュテーブルの内部配列サイズ
        int index = hashCode % arraySize;

        System.out.println("取得するデータのインデックス:" + index);
        System.out.println("取得したデータ:" + hashMap.get(21));
    }
}

上記のコードでは、JavaのHashMapクラスを用いてハッシュテーブルを操作しています。

ハッシュ値(ここではhashCode)と内部配列のサイズ(arraySize)を%演算子で割ることで、どのインデックスにデータが保存されているかを特定しています。

このコードを実行すると、「取得するデータのインデックス:5」および「取得したデータ:Banana」と出力されます。

●関連するJavaの演算子と機能

%演算子を理解すると、他のJavaの演算子や機能とどのように連携させるかが見えてきます。

特に算術演算子やMathクラスのメソッドとの相性は非常によく、高度な計算を行う際に便利です。

○+演算子、-演算子など

%演算子は、基本的な算術演算子(+、-、*、/)としばしば組み合わせて使用されます。

例えば、整数の範囲を制限しつつ、その値に何らかの数値を加算または減算する場合などです。

public class BasicArithmetic {
    public static void main(String[] args) {
        int num = 17;
        int divisor = 5;

        // %演算子と+演算子を組み合わせて使用
        int result = (num + 2) % divisor;

        System.out.println("計算結果:" + result);
    }
}

このJavaコード例では、変数numに2を加算した後、divisorで割った余りを計算しています。

計算結果は変数resultに格納され、出力されます。

この場合、”計算結果:4″と出力されることになります。

○Mathクラスのメソッド

Javaには、数学的な計算を補助するMathクラスがあります。

このクラスには、平方根を求めるMath.sqrt()や絶対値を求めるMath.abs()など、多くの静的メソッドが定義されています。

public class MathClassExample {
    public static void main(String[] args) {
        int num = 17;
        int divisor = 5;

        // %演算子を使って余りを求め、Math.absで絶対値に変換
        int result = Math.abs(num % divisor - divisor);

        System.out.println("絶対値の計算結果:" + result);
    }
}

上記のJavaコードでは、numdivisorで割った余りからdivisorを引き、その結果の絶対値を求めています。

具体的には、17 % 5 から 5を引くと、2から5を引いた結果が-3になります。

この-3の絶対値は3となり、これが変数resultに格納されて出力されます。

出力結果は、”絶対値の計算結果:3″となります。

まとめ

この記事を通じて、Javaの%演算子の多面的な使い方を解説しました。

剰余の基本的な取得から、偶数・奇数の判定、ループの制御、配列の循環アクセス、高速計算、負の数や0での剰余計算への対処法、さらには自分で剰余計算関数を作成する方法まで、幅広く詳しく解説しました。

%演算子単体でも非常に便利ですが、+、-などの算術演算子やMathクラスのメソッドと組み合わせることで、その有用性はさらに広がります。

これらを駆使することで、プログラミングの多くの場面で役立つコードを書くことが可能です。

この知識を生かして、Javaプログラミングのスキル向上に役立ててください。