如何从十进制转换为位掩码?
How to translate from decimal to bit-mask?
我有一个以前由其他人构建的 ACL 系统,我想了解位掩码在那里的工作原理。我定义了这 4 个常量:
const NONE = 0;
const READ = 1;
const WRITE = 2;
const UPDATE = 4;
const DELETE = 8;
然后在 DB 中,我看到具有 1、2、5、9、15 等权限的用户。我尝试使用 this tool 来转换它们,结果是:
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
因为最后两位是 1
我假设那些拥有 3
的用户将拥有 UPDATE|DELETE
权限(参见上面的 table)。那正确吗?如果不是,从十进制转换为位掩码的正确方法是什么?
0 = NONE
是特例,可以通过简单的比较来判断。
如果你想问的问题是 cn
与 2^(n-1)
设置的值,那么我们用 (1 = yes, 0 = no, % = modulo):
(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
我有一个以前由其他人构建的 ACL 系统,我想了解位掩码在那里的工作原理。我定义了这 4 个常量:
const NONE = 0;
const READ = 1;
const WRITE = 2;
const UPDATE = 4;
const DELETE = 8;
然后在 DB 中,我看到具有 1、2、5、9、15 等权限的用户。我尝试使用 this tool 来转换它们,结果是:
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
因为最后两位是 1
我假设那些拥有 3
的用户将拥有 UPDATE|DELETE
权限(参见上面的 table)。那正确吗?如果不是,从十进制转换为位掩码的正确方法是什么?
0 = NONE
是特例,可以通过简单的比较来判断。
如果你想问的问题是 cn
与 2^(n-1)
设置的值,那么我们用 (1 = yes, 0 = no, % = modulo):
(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