2

我有位 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。
  • 其他位是可变的。比较的双方将具有相同的位数。
  • 我想检测如何在考虑其他位并忽略第一个位的情况下进行比较。

用例:

  • 我有 2 个权限值。第一个是 5/101(需要的权限),第二个是 6/110(用户拥有的权限)。
  • 排除第一个块,它总是 1,我想比较代表系统中某个权限规则的第三个块(使用按位)。
  • “所需的权限”位掩码表示:
    • 1- 我用来考虑左侧填充零的始终固定值(除非有其他方法可以实现);
    • 0- 另一个对此比较无用的权限规则(我们称之为权限 1);
    • 1- 当前权限规则所需的权限(我们称之为权限 2)。
  • “用户拥有的权限”是指:
    • 1- 要删除的固定值;
    • 1- 代表用户对权限1的值;
    • 0- 代表权限 2 的用户值。权限 2 的值为 1,但用户的值为 0,则不允许他执行所需的操作。相反,将允许执行该操作。

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

4

3 回答 3

3

只需“和”带有第一位关闭的掩码的参数,例如011 & arg在比较它们之前。

编辑:在重述问题之后。

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

于 2013-02-18T00:54:13.547 回答
3

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

bitmask = (1 << numofbits) - 1

如果您不知道numofbits,只需使用 循环num = num >> 1,并计算迭代,直到您得到num == 0

对于用例:

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

这只是ands 角色位,ans 削减了高位(始终为 1)


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

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

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

它有什么作用?

  • 比较所有位,相等的位将为 0
  • 还原所有低位,因此相等的位将为 1(将高位排除在外,因此它将保持为 0)
于 2013-02-18T01:38:23.347 回答
1

试试这个:

// 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;
}
于 2013-02-18T01:50:07.100 回答