では「フラグ管理」を題材にしたサンプルコードを、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
Java1 << 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して代入」。EMAILとPUSHがONになり、settingは0011になる。
4. フラグが立っているか確認
boolean emailOn = (setting & EMAIL) != 0;
boolean smsOn = (setting & SMS) != 0;
Javasetting & EMAIL→0011 & 0001 = 0001→ 0ではない → truesetting & SMS→0011 & 0100 = 0000→ 0 → false
👉 EMAILはON、SMSはOFFと判定できる。
5. フラグをOFFにする
setting &= ~PUSH; // 0001
Java~PUSHは...11111101(PUSHのビットだけ0)0011 & 11111101 = 0001- これでPUSHがOFFになり、
settingは0001に戻る。
6. 出力結果
EMAIL ON? true
SMS ON? false
最終設定値: 1
Javaポイント整理
- ONにする →
setting |= FLAG; - OFFにする →
setting &= ~FLAG; - 確認する →
(setting & FLAG) != 0
この仕組みを使うと、1つの整数で複数のON/OFFを管理できるので、メモリ効率が良く、処理も速いです。
