1

以前に他の誰かによって構築された ACL システムがあり、そこでビットマスキングがどのように機能するかを理解しようとしています。私はこの4つの定数を定義しています:

const NONE = 0;
const READ = 1;
const WRITE = 2;
const UPDATE = 4;
const DELETE = 8;

次に、DB で、1、2、5、9、15 のような権限を持つユーザーが表示されます。このツールを使用してそれらを変換しようとしたところ、次の結果になりました。

0 // NONE
1 // READ
2 // WRITE
3 // UPDATE|DELETE
4 // UPDATE
5 // WRITE|DELETE
6 // WRITE|UPDATE
7 // WRITE|UPDATE|DELETE
8 // DELETE
9 // READ|DELETE
10 // READ|UPDATE
11 // READ|UPDATE|DELETE
12 // READ|WRITE
13 // READ|WRITE|DELETE
14 // READ|WRITE|UPDATE
15 // READ|WRITE|DELETE|UPDATE

この作品について、私は次のように考えています。

Decimal    Hexadecimal
3          00000011

最後の 2 つのビットは であるため、これらのユーザーにはアクセス許可があると1想定しています(上記の表を参照)。そうですか?そうでない場合、10進数からビットマスクに変換する正しい方法は何ですか?3UPDATE|DELETE

4

1 に答える 1

1

0 = NONEは単純な比較で確認できる特殊なケースです。

cn質問がセットの値で一定であると尋ねたい場合は2^(n-1)、(1 = はい、0 = いいえ、% = モジュロ) でこれを行います。

(value / cn) % 2

設定されているすべてのフラグを取得したい場合は、次の擬似コードを使用してこれを行うことができます。

c := 1
while value > 0
    if value % 2 = 1
        // constant c is set
        ...
    end if
    value := value / 2
    c := c * 2
end while
于 2016-11-22T21:31:02.930 に答える