Java | ビット演算子とシフト演算子

Java Java
スポンサーリンク

では「フラグ管理」を題材にしたサンプルコードを、1行ずつ追いながら解説していきます。
「複数のON/OFF設定を1つの整数でまとめる」典型的な使い方です。


サンプルコード

public class FlagExample {
    public static void main(String[] args) {
        // フラグの定義(1, 2, 4 と2倍ずつにしておく)
        final int EMAIL = 1 << 0; // 0001
        final int PUSH  = 1 << 1; // 0010
        final int SMS   = 1 << 2; // 0100

        int setting = 0; // 0000(全部OFF)

        // フラグをONにする(ORで足す)
        setting |= EMAIL; // 0001
        setting |= PUSH;  // 0011

        // フラグが立っているか確認(ANDでチェック)
        boolean emailOn = (setting & EMAIL) != 0;
        boolean smsOn   = (setting & SMS)   != 0;

        // フラグをOFFにする(ANDとNOTの組み合わせ)
        setting &= ~PUSH; // 0001(PUSHをOFF)

        // 結果を表示
        System.out.println("EMAIL ON? " + emailOn);
        System.out.println("SMS   ON? " + smsOn);
        System.out.println("最終設定値: " + setting);
    }
}
Java

実行の流れを追う

1. フラグの定義

final int EMAIL = 1 << 0; // 0001
final int PUSH  = 1 << 1; // 0010
final int SMS   = 1 << 2; // 0100
Java
  • 1 << 0 → 1(2進数で 0001
  • 1 << 1 → 2(2進数で 0010
  • 1 << 2 → 4(2進数で 0100

👉 こうして「1ビットごとに意味を割り当てる」。


2. 初期状態

int setting = 0; // 0000
Java
  • まだ何もONになっていない。

3. フラグをONにする

setting |= EMAIL; // 0001
setting |= PUSH;  // 0011
Java
  • |= は「ORして代入」。
  • EMAILPUSH がONになり、setting0011 になる。

4. フラグが立っているか確認

boolean emailOn = (setting & EMAIL) != 0;
boolean smsOn   = (setting & SMS)   != 0;
Java
  • setting & EMAIL0011 & 0001 = 0001 → 0ではない → true
  • setting & SMS0011 & 0100 = 0000 → 0 → false

👉 EMAILはON、SMSはOFFと判定できる。


5. フラグをOFFにする

setting &= ~PUSH; // 0001
Java
  • ~PUSH...11111101(PUSHのビットだけ0)
  • 0011 & 11111101 = 0001
  • これでPUSHがOFFになり、setting0001 に戻る。

6. 出力結果

EMAIL ON? true
SMS   ON? false
最終設定値: 1
Java

ポイント整理

  • ONにするsetting |= FLAG;
  • OFFにするsetting &= ~FLAG;
  • 確認する(setting & FLAG) != 0

この仕組みを使うと、1つの整数で複数のON/OFFを管理できるので、メモリ効率が良く、処理も速いです。

タイトルとURLをコピーしました