Преобразование байт в битсет

Вопрос:

Я использую следующий код для преобразования:

public static BitSet fromByte(byte b){
BitSet bs = new BitSet(8);
for (int i=0; i<8; i++){
if ((b & (1 << i)) > 0){
bs.set(i);
}
}
int length = bs.length();

return bs;
}

Вывод: {0, 3, 4, 5, 6} (из отладочного дисплея bs) — индексы, в которых установлены биты. Я думаю, что это должно представлять 1001111 с длиной = 7, но неверно, так как 1001111 равно 79, а не 121. Также я хочу, чтобы длина была 8. В принципе, мне нужен бит-набор длиной 8, который правильно отображает любой номер байта. Мое ожидание было бы 01111001, а отображение отладчика показать {1,2,3,4,5,7}

Лучший ответ:

{0, 3, 4, 5, 6} равно: (2 ^ 0) | (2 ^ 3) | (2 ^ 4) | (2 ^ 5) | (2 ^ 6)

2^0 = 00000001
2^3 = 00001000
2^4 = 00010000
2^5 = 00100000
2^6 = 01000000
--------------
      01111001

Как вы уже догадались, 0 также является показателем бит равным 1. Но биты упорядочены справа налево.

Ответ №1

Биты в байте пронумерованы справа налево, а не слева направо. Поэтому, задание битов {0, 3, 4, 5, 6} определяет этот шаблон:

7 6 5 4 3 2 1 0
0 1 1 1 1 0 0 1

Ответ №2

Вы проверяете бит в следующем порядке:

00000001 = index 0
00000010 = index 1
00000100 = index 2
00001000 = index 3
etc.

т.е. справа налево и сохраняя их слева направо в наборе бит.

Ответ №3

Длина битового набора будет равна количеству бит, если необходимо, чтобы представить биты, которые вы установили. Например, если вы установите первые три бита, длина будет равна 2, так как для представления необходимы только 2 бита.

Конструктор BitSet устанавливает его размер, а не его длину. Я подозреваю, что это две разные концепции.

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

Оцените статью
TechArks.Ru
Добавить комментарий