Как реализовать битовый массив?

Текущее направление:

Начните с символа без знака, который в моей системе составляет 1 байт, используя sizeof. Диапазон 0-255. Если длина - это количество бит, которое мне нужно, то elements - это количество элементов (байтов), которые мне нужны в моем массиве.

constant unsigned int elements = length/8 + (length % y > 0 ? 1 : 0);  
unsigned char bit_arr[elements];

Теперь я добавляю базовые функции, такие как установка, отключение и проверка. Где j - это бит на байтовый индекс, i - это байтовый индекс, а h = битовый индекс. У нас i = h / 8 и j = i% 8.

Псевдо-код:

bit_arr[i] |= (1 << j); // Set 
bit_arr[i] &= ~(1 << j);  // Unset
if( bit_arr[i] & (1 << j) ) // Test

person Community    schedule 13.05.2011    source источник
comment
Избегайте паузы. Вместо этого используйте операторы битового сдвига ‹< и ››. (1 ‹---------------- i) == 2 ^ i.   -  person Steve314    schedule 14.05.2011
comment
Я не знал, что для этого можно использовать битовый сдвиг. Спасибо.   -  person Dhaivat Pandya    schedule 14.05.2011
comment
‹Pedantry› Нет ничего, что гарантирует байт == 8 бит. Он может отличаться в зависимости от платформы / процессора. IIRC CHAR_BITS сообщит вам, сколько бит находится в char (который совпадает с байтом в C, BTW - он определяется как наименьшая индивидуально адресуемая единица памяти). ‹/Pedantry›   -  person cHao    schedule 14.05.2011
comment
if( bit_arr[i] &= pow(2,j) ) для теста неверно, просто используйте &, а не &=.   -  person Random832    schedule 14.05.2011


Ответы (2)


Похоже, вы очень хорошо представляете, что нужно делать. Хотя вместо pow(2, j) используйте 1 << j. Вам также необходимо изменить свой test код. Вы не хотите, чтобы тест выполнял присвоение массиву.

person QuantumMechanic    schedule 13.05.2011

pow() даст вам значения с плавающей запятой, которые вам не нужны. Вообще. Это может сработать для вас, если вы используете степень двойки, но это может стать странным, когда j становится больше.

Лучше вместо этого использовать 1 << j. Устраняет любые шансы на появление странностей с плавающей точкой и, вероятно, работает лучше.

person cHao    schedule 13.05.2011