では、ビット演算とシフト演算を使ったメニューのON/OFF管理(フラグ管理)を、初心者向けにJavaで実装例を作ります。実際に動かせるサンプルで、ステップごとに解説します。これを作ると「実用でビット演算がどう活きるか」が直感で理解できます。
1. フラグ管理の基本アイデア
- 1つの整数(
int)のビットをそれぞれ「ON/OFF」に使う - 例:8ビットなら最大8個のフラグを管理できる
| ビット | 0 | 1 | 2 | 3 | … |
|---|---|---|---|---|---|
| フラグ | A | B | C | D | … |
- ビットが 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
Java1 << 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. 解説(ステップごと)
|=→ 指定のメニューをON&= ~→ 指定のメニューをOFF^=→ 指定のメニューを切り替え(ON→OFF、OFF→ON)& FLAG→ 指定のメニューがONか確認
この方法を覚えると、8個以上の設定や状態を 1つの整数で効率よく管理 できます。ゲームやアプリの設定管理でもよく使われます。
See the Pen Visualizing Bitwise Operations and Flag Management #2 by MONO365 -Color your days- (@monoqlo365) on CodePen.
特徴・解説
- 32ビット表示
- Javaの
intと同じ幅で表示 - 左端の1ビットが 符号ビット
- Javaの
- 符号ビットの可視化
- 左端のビットを赤文字にして負の数かどうかを判別
- フラグ管理
- 下位4ビットで
File,Edit,View,HelpをON/OFF - XORで切替、ANDでチェック、ORでON、
&=~でOFF
- 下位4ビットで
- シフト演算
<<左シフト>>符号あり右シフト>>>符号なし右シフト
- アニメーション
- ビットが変化するたびにフェードアウト→フェードインで滑るように表示
- シフト操作や負の数の符号変化も直感的に理解可能
