Метод Java setBit с использованием сдвига битов и шестнадцатеричного кода - вопрос - PullRequest
1 голос
/ 16 апреля 2010

У меня проблемы с пониманием того, что происходит в двух строках с 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 = is byte [] out = new byte [numOfBytes]; (numOfBytes может быть 7 в этой ситуации) i = число [57], исходное число из массива PC1 int, содержащее 56 целых чисел. val = это бит, взятый из байтового массива из метода getBit ().

Ответы [ 2 ]

2 голосов
/ 16 апреля 2010

Прежде всего 0xFF7F - это 1111 1111 0111 1111. Это смещается вправо на количество бит, рассчитанное на основе бита, который вы передаете в качестве параметра (то есть того, который вы хотите установить).

Если вы укажете третий бит posBit = 3 % 8 = 3, то

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

это значение затем И с исходным байтом, который вы модифицируете, в результате каждый бит сохраняется равным oldBit исходному биту, кроме того, который анодирован битом 0, предположим, что у вас есть, например, oldByte == 0111 1010, вы получите:

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

Затем значение добавляется 0xFF только для того, чтобы отбросить любой бит, который не помещается в байт (потому что это по крайней мере девятый бит) перед выполнением приведения.

1 голос
/ 17 апреля 2010

Лучший способ написать это было бы:

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);
}
...