たとえば、携帯電話には次のマーカーが付いている場合があります。
フラグ = 電話属性
- 画面が破損していないか case1
- バッテリーは充電されていますか2
- カメラケースはありますか3
- case4に電話してもいいですか?
- Appleの携帯電話ケースですか5
- 保証期間内ですか case6
通常、n 個のパラメータを格納するには bool 型を使用しますが、int または long を使用して格納することもできます。Java では、int は 4 バイトを占有し、各バイトは 8 ビット、合計 32 ビットを占有します。 store 32 マークは 32 個のブール値を保存します。
int 値のマークをビット演算で操作します。int 値自体の大きさには意味はなく、対応する 2 進数の位置のみに注目します。0 はマークなし、1 はマークを意味します。
フラグにフラグを追加
公式:
flag |= case1
flag |= case2
flag |= case2|case2
バイナリ計算のデモ:
flag = 0000 0000
case1 = 0000 0001
case2 = 0000 0100
或运算后↓
flag = 0000 0101
ジャッジメントマーク
公式:
//单个标记判断
bool = (flag & case1) != 0
//复合标记判断
bool = (flag & control) != 0
バイナリ計算のデモ:
flag = 0000 0000
case1 = 0000 0001
与运算后↓
flag = 0000 0000
マークを削除
公式:
flag &= ~case1
バイナリ計算のデモ:
case1 = 0000 0001
~case1 = 1111 1110
flag = 0000 0001
flag&=~case1 = 0000 0000
チップ
複合ケースでない限り、0010 0001 のように単一の意味を持つケースが出現することはなく、マーク ビットが 2 つ出現することはなく、ケースの位置が競合することはありません。
ケースは Java の shift メソッドを使用して定義できます。
int flag = 0; // 0000 0000 0000 0000 0000 0000 0000 0000
int case1 = 1; // 0000 0000 0000 0000 0000 0000 0000 0001
int case2 = 1 << 1; // 0000 0000 0000 0000 0000 0000 0000 0010
int case3 = 1 << 2; // 0000 0000 0000 0000 0000 0000 0000 0100
int case4 = 1 << 3; // 0000 0000 0000 0000 0000 0000 0000 1000
サンプルコード
int flag = 0 << 0;
int case1 = 1 << 0;
int case2 = 1 << 1;
int case3 = 1 << 2;
int case4 = 1 << 31;
//加标记
flag |= case1;
flag |= case2;
flag |= case3;
flag |= case4;
//验证标记
Assert.assertTrue((flag & case1) != 0);
Assert.assertTrue((flag & case2) != 0);
Assert.assertTrue((flag & case3) != 0);
Assert.assertTrue((flag & case4) != 0);
//删除标记
flag &= ~case1;
flag &= ~case2;
flag &= ~case3;
flag &= ~case4;
//验证标记
Assert.assertFalse((flag & case1) != 0);
Assert.assertFalse((flag & case2) != 0);
Assert.assertFalse((flag & case3) != 0);
Assert.assertFalse((flag & case4) != 0);