使用逐位比较权限模型忽略第一位



我有位101和110。我想使用一些逐位运算符进行比较,忽略第一位,如01和10。

示例:

I have:
101
110
===
01 & 10 <- How I want to consider
x00 <- The result I want

10110
11011
=====
0110 & 1011 <- How I want to consider
x0010 <- The result I want

如何在java中使用位运算符来实现这一点?

详细信息:

  • 第一位将始终为1
  • 其他位是可变的。二者都比较的边将具有相同数量的比特
  • 我想检测一下如何在考虑其他比特和忽略第一个

用例:

  • 我有两个权限值。第一个是5/101(需要权限),第二个是6/110(用户拥有的权限)
  • 除了第一个块,它总是1,我想比较代表系统中某个权限规则的第三个块(使用逐位)
  • "所需权限"位掩码是指:
    • 1-一个总是固定的值,我用来考虑左填充零(除非有其他方法可以实现)
    • 0-另一个对该比较无效的权限规则(让我们称之为权限1)
    • 1-当前权限规则所需的权限(让我们称之为权限2)
  • "用户拥有的权限"是指:
    • 1——一个固定值,需要进行条带化
    • 1-表示权限为1的用户的值
    • 0-表示权限2的用户值。权限2的值为1,但用户的值为0,则不允许他执行所需的操作。相反的情况是允许执行该操作

对于这种情况,任何更好的解决方案都将被认为是正确的答案。

如果您知道有用位的数量(例如numofbits = 5),则表达式的位掩码为:

bitmask = (1 << numofbits) - 1

如果你不知道numofbits,就用num = num >> 1做一个循环,计算迭代次数,直到得到num == 0

对于用例:

result = (req_roles & user_roles) & (bitmask >> 1)

这只是and的角色位,并剪切高位(始终为1)


上一个问题的上一个答案:):

如果您知道最高数字的位掩码(例如bitmask = 0x1f(以位为单位的11111),那么您需要以下表达式的结果:

result = (a ^ b) ^ (bitmask >> 1)

它做什么?

  • 比较所有位,相等的位将为0
  • 还原所有低位,所以相等的位将为1(去掉高位,所以它将保持0)

在比较它们之前,只对带有第一位为off的掩码的参数(例如011 & arg)执行'and'。

编辑:在重述问题之后。

另一种选择是使用基于角色的权限,这些权限比布尔权限字符串更灵活、更容易理解。他们也在自我记录。基于位字符串的权限很少使用,除非内存或磁盘空间非常宝贵,比如Unix在80年代初开发或在嵌入式系统中。

试试这个:

// tester 1
int x, y, z, mask;
x = 0x05; // 101
y = 0x06; // 110
mask = getMask(x, y);
z = (mask & (x & y));
System.out.println(String.format("mask: %x result: %x", mask, z));
// tester 2    
int x, y, z, mask;
x = 0x16; // 10110
y = 0x1B; // 11011
mask = getMask(x, y);
z = (mask & (x & y));
System.out.println(String.format("mask: %x result: %x", mask, z));
private int getMask(final int x, final int y) {
    int mask = findHighOrderOnBit(x, 0);
    mask = findHighOrderOnBit(y, mask) - 1;
    return mask;
}
private int findHighOrderOnBit(final int target, final int otherMask) {
    int result = 0x8000;
    for (int x = 0; x != 16; x++) {
        if ((result & target) > 0)
            break;
        result >>= 1;
    }
    if (otherMask > result)
        result = otherMask;
    return result;
}

最新更新