如何从十进制转换为位掩码?

时间:2016-11-22 21:03:37

标签: hex decimal bitmask bit-masks

我有一个以前由其他人构建的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权限(参见上表)。是对的吗?如果不是从十进制转换为位掩码的正确方法是什么?

1 个答案:

答案 0 :(得分: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