Java:使用掩码检查二进制值,然后获取整数

时间:2012-09-18 08:52:49

标签: java bit-manipulation bitmask

这是我的问题:

  

我有二进制值

     
    

101001

  
     

和面具

     
    

011100

  
     

我想比较它们并将结果作为整数得出。在这种情况下,将给出:

     
    

1 010 01
    0 111 00

         

= 010 => 2

  

我的第一个想法是处理一个字符数组。但我想知道在Java中是否有更好的方法来实现这一目标?

3 个答案:

答案 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)

当然。

  1. 你需要先和你的位。
  2. 向右移动以避免掩码右侧的那些零。
  3. 您需要将值作为整数。

    然后执行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)