Во-первых, если вы выполняете побитовые операции, это обычно
предпочтительнее сделать элементы целочисленного типа без знака
(хотя в этом случае, это действительно не так уж много
разница). Что касается доступа к битам: для доступа к биту I в
массив из n int:
static int const bitsPerWord = sizeof(int) * CHAR_BIT;
assert( i >= 0 && i < n * bitsPerWord );
int wordIndex = i / bitsPerWord;
int bitIndex = i % bitsPerWord;
затем читать:
return (array[wordIndex] & (1 << bitIndex)) != 0;
установить:
array[wordIndex] |= 1 << bitIndex;
и сбросить:
array[wordIndex] &= ~(1 << bitIndex);
Или вы можете использовать битовый набор, если n
является постоянным, или vector<bool>
, или
boost::dynamic_bitset
если это не так, и пусть кто-то другой сделает
работа.