使用位移和十六进制代码的setBit java方法 - 问题

时间:2010-04-16 19:47:16

标签: bit-manipulation hex

我无法理解0xFF7F和它下面的一行中发生的情况。这里有一个链接可以在某种程度上解释它。 http://www.herongyang.com/java/Bit-String-Set-Bit-to-Byte-Array.html 我不知道0xFF7F>> posBit)& oldByte)&设为0x00FF 应该是3个值“和”在一起或如何读取它。如果有人能够更好地澄清这里发生的事情,我将非常感激。

private static void setBit(byte[] data,
                               final int pos,
                               final int val) {
        int posByte = pos/8;
        int posBit = pos%8;
        byte oldByte = data[posByte];
        oldByte = (byte) (((0xFF7F>>posBit) & oldByte) & 0x00FF);
        byte newByte = (byte) ((val<<(8-(posBit+1))) | oldByte);
        data[posByte] = newByte;
    }

传入此方法,因为selectBits方法的参数是setBit(out,i,val); out =是byte [] out = new byte [numOfBytes]; (在这种情况下,numOfBytes可以是7) i =数字[57],来自PC1 int数组的原始数字,保持56个整数。 val =从getBit()方法的字节数组中取出的位。

2 个答案:

答案 0 :(得分:2)

首先0xFF7F1111 1111 0111 1111。这会从您作为参数传递的位计算出的位数向右移动(因此您想要设置的位数)。

如果指定第三位posBit = 3 % 8 = 3,那么

0xFF7F 1111 1111 0111 1111
>> 3   0001 1111 1110 1111

然后将该值与您正在修改的原始字节进行AND运算,结果是每个位保持等于oldBit原始位,除了与0位相关的位,假设您例如oldByte == 0111 1010,您将获得:

    0111 1010
&   1110 1111
-------------
    0110 1010

然后该值以0xFF为止,只是为了在执行转换之前丢弃任何不适合字节的位(因为它至少是第9位)。

答案 1 :(得分:1)

更好的方法是:

private static void setBit(byte[] data, int index, boolean value)
{
    final int byteIndex = index / 8;
    final int bitIndex = 7 - (index % 8);

    final byte mask = (byte) (1 << bitIndex);
    final byte valueBit = value ? mask : 0;

    data[byteIndex] = (byte) ((data[byteIndex] & ~mask) | valueBit);
}