Java | ビット演算とシフト演算を使ったメニューのON/OFF管理(フラグ管理)

Java Java
スポンサーリンク

では、ビット演算とシフト演算を使ったメニューのON/OFF管理(フラグ管理)を、初心者向けにJavaで実装例を作ります。実際に動かせるサンプルで、ステップごとに解説します。これを作ると「実用でビット演算がどう活きるか」が直感で理解できます。


1. フラグ管理の基本アイデア

  • 1つの整数(int)のビットをそれぞれ「ON/OFF」に使う
  • 例:8ビットなら最大8個のフラグを管理できる
ビット0123
フラグABCD
  • ビットが 1 → ON
  • ビットが 0 → OFF

メニューの状態(表示/非表示)や設定ON/OFFを効率よく管理できます。


2. フラグの定義(定数を使う)

// フラグ定義(1<<0, 1<<1, … でビット位置を指定)
final int FLAG_A = 1 << 0; // 0001
final int FLAG_B = 1 << 1; // 0010
final int FLAG_C = 1 << 2; // 0100
final int FLAG_D = 1 << 3; // 1000
Java
  • 1 << n は「1を左にnビットシフト」= 2のn乗
  • 例:1 << 2 = 0100 = 4

3. フラグ管理用変数

int flags = 0; // すべてOFF
Java
  • すべてのフラグがOFF(0)からスタート

4. フラグをONにする(立てる)

flags |= FLAG_A; // AフラグをON
flags |= FLAG_C; // CフラグをON
Java
  • |= はビットOR代入
  • 元のフラグ状態を壊さずに指定のビットだけONにする

5. フラグをOFFにする(消す)

flags &= ~FLAG_C; // CフラグをOFF
Java
  • ~FLAG_C で Cフラグだけ反転 → 1111…1011
  • &= で AND すると Cビットだけ0になり、他のビットはそのまま

6. フラグのON/OFFを確認する

boolean isA = (flags & FLAG_A) != 0; // AフラグONならtrue
boolean isB = (flags & FLAG_B) != 0; // BフラグONならtrue
Java
  • & で該当ビットを取り出す
  • 0でなければON、0ならOFF

7. フラグを切り替える(toggle)

flags ^= FLAG_B; // BフラグをON→OFF、OFF→ONに切り替え
Java
  • ^= はビットXOR代入
  • ビットの状態を反転(トグル)するのに便利

8. 完全なJavaサンプル(メニューON/OFF管理)

public class MenuFlags {
    // フラグ定義
    static final int MENU_FILE   = 1 << 0; // 0001
    static final int MENU_EDIT   = 1 << 1; // 0010
    static final int MENU_VIEW   = 1 << 2; // 0100
    static final int MENU_HELP   = 1 << 3; // 1000

    public static void main(String[] args) {
        int menuFlags = 0; // すべてOFF

        // メニューをONにする
        menuFlags |= MENU_FILE; // File ON
        menuFlags |= MENU_VIEW; // View ON

        System.out.println("File ON? " + ((menuFlags & MENU_FILE) != 0));
        System.out.println("Edit ON? " + ((menuFlags & MENU_EDIT) != 0));
        System.out.println("View ON? " + ((menuFlags & MENU_VIEW) != 0));
        System.out.println("Help ON? " + ((menuFlags & MENU_HELP) != 0));

        // EditメニューをONにする
        menuFlags |= MENU_EDIT;

        // ViewメニューをOFFにする
        menuFlags &= ~MENU_VIEW;

        // Bフラグ(Help)を切り替え
        menuFlags ^= MENU_HELP;

        System.out.println("\n更新後の状態:");
        System.out.println("File ON? " + ((menuFlags & MENU_FILE) != 0));
        System.out.println("Edit ON? " + ((menuFlags & MENU_EDIT) != 0));
        System.out.println("View ON? " + ((menuFlags & MENU_VIEW) != 0));
        System.out.println("Help ON? " + ((menuFlags & MENU_HELP) != 0));
    }
}
Java

出力例

File ON? true
Edit ON? false
View ON? true
Help ON? false

更新後の状態:
File ON? true
Edit ON? true
View ON? false
Help ON? true

9. 解説(ステップごと)

  1. |= → 指定のメニューをON
  2. &= ~ → 指定のメニューをOFF
  3. ^= → 指定のメニューを切り替え(ON→OFF、OFF→ON)
  4. & FLAG → 指定のメニューがONか確認

この方法を覚えると、8個以上の設定や状態を 1つの整数で効率よく管理 できます。ゲームやアプリの設定管理でもよく使われます。


See the Pen Visualizing Bitwise Operations and Flag Management #2 by MONO365 -Color your days- (@monoqlo365) on CodePen.

特徴・解説

  1. 32ビット表示
    • Javaの int と同じ幅で表示
    • 左端の1ビットが 符号ビット
  2. 符号ビットの可視化
    • 左端のビットを赤文字にして負の数かどうかを判別
  3. フラグ管理
    • 下位4ビットで File, Edit, View, Help をON/OFF
    • XORで切替、ANDでチェック、ORでON、&=~でOFF
  4. シフト演算
    • << 左シフト
    • >> 符号あり右シフト
    • >>> 符号なし右シフト
  5. アニメーション
    • ビットが変化するたびにフェードアウト→フェードインで滑るように表示
    • シフト操作や負の数の符号変化も直感的に理解可能
タイトルとURLをコピーしました