Почему неправильное представление битов получается путем преобразования байтового массива в BitSet в Java - PullRequest
0 голосов
/ 13 февраля 2019

Я попытался преобразовать байтовый массив, чтобы использовать его битовое представление.

Ввод:

byte[] values = new byte[]{21, 117, 41, -1};

Я хотел бы создать один объект BitSet из байтового массива, но я разделил его, чтобы исследовать проблему, и попытался создать несколько BitSetобъекты из каждого элемента массива.

Объекты BitSet создаются следующим образом:

BitSet bitSetTwentyOne = BitSet.valueOf(new byte[]{21});
BitSet bitSetOneHundredSevenTeen = BitSet.valueOf(new byte[{117});
BitSet bitSetFourtyOne = BitSet.valueOf(new byte[]{41});
BitSet bitSetMinusOne = BitSet.valueOf(new byte[]{-1});

Биты распечатываются с использованием следующегоМетод:

private String getBits(BitSet bitSet) {
    StringBuilder bitsBuilder = new StringBuilder();

    for (int i = 0; i < bitSet.length(); i++) {
        bitsBuilder.append(bitSet.get(i) == true ? 1 : 0);
    }

    return bitsBuilder.toString();
}

Вывод:

bitSetTwentyOne: 10101 but expected -> 00010101 (BitSet::length = 5)
bitSetOneHundredSevenTeen: 1010111 but expected -> 01110101 (BitSet::length = 7)
bitSetFourtyOne: 100101 but expected -> 00101001 (BitSet::length = 6)
bitSetMinusOne: 11111111 but it is as expected at least (BitSet::length = 8)

Я хочу, чтобы все значения имели ширину 8 бит, даже если это необходимо для заполнения нулями.Я не понимаю, почему он дает неправильные двоичные значения в случае преобразования 117 и 41 .

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019
  • length() доставляет логическую длину *1003* с использованием старшего бита 1.
  • size() даст 8.
  • cardinality() дастколичество бит 1 с.

Итак, вы должны были использовать size().

И тогда биты имеют формат little-endian , и вы изменили его насначала выводится бит 0.

private String getBits(BitSet bitSet) {
    StringBuilder bitsBuilder = new StringBuilder();
    for (int i = 0; i < bitSet.size(); ++i) {
        bitsBuilder.insert(0, bitSet.get(i) ? '1' : '0');
    }
    return bitsBuilder.toString();
}
0 голосов
/ 13 февраля 2019

Похоже, вы печатаете биты задом наперед.Обратите внимание, что ваш вывод (за исключением желаемых начальных нулей) является зеркальным отображением ожидаемого ввода.

Используя ваш код, передавая 4, который должен быть 100, я получаю 001.Похоже, что бит 0 является младшим, а не старшим битом.Чтобы исправить это, переберите индексы в обратном направлении.Причина того, что -1 и 41 являются правильными, кроме ведущих нулей, заключается в том, что их представления наборов битов являются палиндромами.

Для добавления начальных нулей вычтите length() из 8 и выведите столько нулей,Метод length() возвращает только количество битов, необходимое для представления числа.Вы должны кодировать это самостоятельно;для ведущих нулей нет BitSet функциональности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...