Как мне реализовать битовый массив? - PullRequest
1 голос
/ 14 мая 2011

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

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

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

Теперь я добавляю базовые функции, такие как set, unset и test.Где 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

Ответы [ 2 ]

6 голосов
/ 14 мая 2011

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

2 голосов
/ 14 мая 2011

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

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

...