【问题标题】:How to translate from decimal to bit-mask?如何从十进制转换为位掩码?
【发布时间】:2016-11-22 21:03:36
【问题描述】:

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

【问题讨论】:

  • 这只是基础数学。例如。您将获得模 2 的最低位并使用 / 2 移动一位,因此您可以通过重复直到达到 0 来查看 2 的哪些幂(常数)。
  • @maraca 我不确定是否会关注你,举个例子会有所帮助

标签: hex decimal bitmask bit-masks


【解决方案1】:

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

【讨论】:

  • 当然,这一切都必须是整数除法才能工作,并且没有浮点(十进制)数。
猜你喜欢
  • 2016-07-17
  • 1970-01-01
  • 2018-01-15
  • 2018-05-24
  • 1970-01-01
  • 2019-06-10
  • 1970-01-01
  • 1970-01-01
  • 2012-08-16
相关资源
最近更新 更多