这是我的问题:
我有二进制值
101001
和面具
011100
我想比较它们并将结果作为整数得出。在这种情况下,将给出:
1 010 01
0 111 00
= 010 => 2
我的第一个想法是处理一个字符数组。但我想知道在Java中是否有更好的方法来实现这一目标?
答案 0 :(得分:1)
我想比较它们并将结果作为整数
假设你的意思是'面具'而不是'比较':
int result = 0B011100 & 0B011100;
不需要char数组。
这是微不足道的。
答案 1 :(得分:1)
我刚刚改进了算法,以便能够分割一个位,例如:
00111011011
这是我从掩码和掩码值中获取值的函数
private static long getMaskedValue(long maskedValue, long mask){
long definitiveMaskedValue = 0;
int count=0;
maskedValue = mask & maskedValue;
while (mask != 0){
while ((mask & 1) == 0){
mask = mask >>> 1;
maskedValue = maskedValue >>> 1;
}
while ((mask & 1) == 1){
definitiveMaskedValue = definitiveMaskedValue + ((maskedValue & 1) << count);
count++;
mask = mask >>> 1;
maskedValue = maskedValue >>> 1;
}
}
return definitiveMaskedValue;
}
这是我的函数,通过位掩码将值存储在变量中,它返回存储在里面的值的旧变量。 我不得不使用BigInteger,因为移位运算符在Java中不能移动超过32位。
private static long setMaskedValue (long maskedValue, long mask, long valueToAdd) {
int nbZero=0;
int nbLeastSignificantBit=0;
long tmpMask=mask;
maskedValue = maskedValue & ~mask;
while (tmpMask != 0){
while ((tmpMask & 1) == 0){
tmpMask = tmpMask >>> 1;
nbLeastSignificantBit++;
nbZero ++;
}
while ((tmpMask & 1) == 1){
tmpMask = tmpMask >>> 1;
BigInteger bigValueToAdd = BigInteger.valueOf(valueToAdd).shiftLeft(nbZero);
long tmpValueToAdd = bigValueToAdd.longValue();
BigInteger bigMaskOneBit = BigInteger.valueOf(1).shiftLeft(nbLeastSignificantBit);
long maskOneBit = bigMaskOneBit.longValue();
long bitValueToSet = getMaskedValue(tmpValueToAdd, maskOneBit);
maskedValue = maskedValue | bitValueToSet << nbLeastSignificantBit;
nbLeastSignificantBit++;
}
}
return maskedValue;
}
答案 2 :(得分:0)
当然。
您需要将值作为整数。
然后执行AND:int masked = value & mask;
然后向右移动直到面具中的第一个。
while (mask % 2 == 0) {
mask = mask >>> 1;
masked = masked >>> 1;
}
如果您愿意,可以使用while (mask & 1 == 0) {
:)
& is bitwise AND.
| is bitwise OR.
^ is bitwise XOR (if my memory doesn't fail :).
>>> is shifting right (unsigned integer)