ステータスをフラグビットで表示

11568 ワード

多くのフレームワークの中で、私たちはint xxx=0 x 010のようなコードを見ることができて、私たちは彼が状態を表すことしか知らないで、とても牛xで、しかし具体的にどうしてこのようにして、あるいはそれがどのように複数の異なる状態を表すのか全然知らない.
レビュービット演算
ビット演算シンボルリスト
アイコン
英語名
中国語名
\
OR
または
&
AND

~
NOT

^
XOR
異或
>>
-
右に移動
<<
-
左に移動
>>>
-
符号なし右シフト(最上位は常に0を補う)
各演算子の演算方法
1 | 0   // 1,       1     1,        0
1 & 0   // 0      1     1,        0
~ 1     // 0     ,        
1 ^ 0   // 1           ,    1,      0
1 << 1  // 10              
1010 >> 1   // 101             

フラグビット:整数の1つをフラグビットとし、特定の意味を付与します.
もし私たちが1人のユーザーの削除変更権限を保存するならば、4種類の権限の組み合わせ、全部で16中の状態があります.
public static int NONE      = 0;
public static int ADD       = 1;
public static int DELETE    = 2;
public static int READ      = 4;
public static int UPDATE    = 8;

私たちはこのいくつかの値を通じて、ある方向にあるかどうかを表します.なぜこれらの特定の値を使うのですか.
1   =   0001
2   =   0010
4   =   0100
8   =   1000

これらの値はすべて2の次べき乗で、これらの値をバイナリに変換して、各値の1つのビットが1であることを発見して、その他はすべて0で、同じビットは繰り返しません
このように、各状態参加ビット演算は、常にその遷移ビットの値にのみ影響を及ぼす
権限を表す識別permissionをもう1つ定義します.デフォルトは権限がありません.
READを追加する必要がある場合、ADD権限
permission |= ADD | READ;
//  0 | 0001 | 0100 = 0101
/**
0000
0001
0100
----
0101
*/

ADD,READの2つのパーミッションを追加すると,この2つのフラグビットの値は1になる
権限があるかどうかを確認する方法
boolean canRead = (permission & READ) != 0
// 0101 & 0100 = 0100 = ADD
/**
0101
0100
----
0100
*/

権限を削除する方法
permission ^= READ
// 0101 ^ 0100 =  0001
/**
0101
0100
----
0001
*/

別の方法で権限を削除
permission &= ~ READ
// 0101 & 1011 = 0001
/**
 ~0100
  ----
  1011
 &0101
  ----
  0001
*/

ロゴビットの利点
ロゴビットは多くのコードを減らすことができ、理解が簡単です.
オブジェクトに対してbooleanでREADとADD権限を追加すると
setCanRead(true);
setCanAdd(true);
setCanUpdate(false);
setCanDelete(false);

フラグビットで
addPermission(READ | ADD);

booleanでREADとADDの権限を持っているかどうかを判断する
isCanRead();
isCanAdd();

フラグビットで
hasPermission(ADD | READ);

booleanでREADとADDのみの権限を持つかどうかを判断する
isCanAdd() isCanRead && !isCanUpdate() && !isCanDelete()

フラグビットで
isJustAllow(READ | ADD);

前の例のコード
class Permission {
    public static final int NONE        = 0;
    public static final int ADD         = 1;
    public static final int DELETE      = 2;
    public static final int READ        = 4;
    public static final int UPDATE      = 8;

    private int mPermission = NONE;

    public void addPermission(int permission){
        mPermission |= permission;
    }
    public boolean hasPermission(int permission){
        return  (mPermission & permission) != NONE;
    }
    public boolean isJustAllow(int permission){
        return mPermission == permission;
    }
    public void removePermission(int permission){
        mPermission ^= permission;
    }
}

変換元:https://www.denua.cn/blog/article/26/