Прежде всего, один не может реально использовать int
для растрового изображения в C, поскольку сдвига немного влево, чтобы знаковый бит имеет неопределенное поведение, C не гарантирует, что представление двоичного дополнение, или что есть 32 бита в int; что, как говорится, самый простой способ избежать этих ловушек - использовать вместо этого uint32_t
от <stdint.h>
. Таким образом,
#include <stdint.h>
uint32_t bitmap[4];
Так что считайте, что вы цифры этих бит 0 ... 127 из индексов 0 ... 3; и внутри индексов 0 ... 31; таким образом, вы можете получить индекс в массиве и разрядное число в пределах этого значения с помощью следующей формулы:
int bit_number = // a value from 0 ... 127
int index = value >> 32; // shift right by number of bits in each index
int bit_in_value = value & 31; // take modulo 32 to get the bit in value
Теперь вы можете индексировать целое число от:
bitmap[index];
и битовую маску для желаемое значение
uint32_t mask = (uint32_t)1 << bit_in_value;
так что вы можете проверить, если бит установлен, делая
bit_is_set = !!(bitmap[index] & mask);
Теперь, чтобы ускорить работу, вы можете пропустить любой index
, для которого bitmap[index]
равен 0, потому что он не содержит никаких битов; аналогично, в каждом индексе вы можете ускорить процесс путем смещения бит в uint32_t из растрового изображения справа на 1 и маскировки с 1; и разорвать цикл, когда uint32_t становится 0:
for (int index = 0; index <= 3; index ++) {
uint32_t entry = bitmap[index];
if (! entry) {
continue;
}
int bit_number = 32 * index;
while (entry) {
if (entry & 1) {
printf("bit number %d is set\n", bit_number);
}
entry >>= 1;
bit_number ++;
}
}
Кроме этого существует не так много, чтобы ускорить, кроме таблиц поиска, или с помощью встроенных функций компилятора, такие как this to set which is the lowest bit set, но вы все равно придется использовать некоторые все равно ,
Вы уверены, что вам нужен список? Вероятно, быстрее протестировать бит в «битмапе», когда вам нужно, чем искать список для номера бит ... – Dmitri
@Dmitri На самом деле, я хочу знать список наборов битпозиций. –