我有位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;
}