2016-11-22 90 views
1

我有一个先前由其他人建立的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我假设有这些用户将拥有UPDATE|DELETE权限(请参阅上表)。是对的吗?如果不是什么是从十进制转换为位掩码的正确方法?

+0

这只是基础数学。例如。你得到的最低位以模2为单位,并用/ 2移位一位,所以你可以看到2个常量的权重是通过重复设置的,直到你达到0为止。 – maraca

+0

@maraca我不确定是否跟着你,例子将有助于 – ReynierPM

回答

1

0 = NONE是一个特殊的情况,可以通过简单的比较来检查。

如果你要问的问题是与2^(n-1)设定的值不变cn,那么我们这样做有(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 
+0

当然,它必须是整数除法才能工作,并且没有浮点数(小数)。 – maraca

相关问题