Я предполагаю, что индексирование в битовый набор выполняется путем захвата 32-битного значения и последующей изоляции соответствующего бита, потому что это быстрее всего с точки зрения инструкций процессора (работа с меньшими значениями медленнее на x86). Два индекса, необходимые для этого, также могут быть вычислены очень быстро:
int wordIndex = (index & 0xfffffff8) >> 3;
int bitIndex = index & 0x7;
И тогда вы можете сделать это, что тоже очень быстро:
int word = m_pStorage[wordIndex];
bool bit = ((word & (1 << bitIndex)) >> bitIndex) == 1;
Кроме того, максимальная трата 3 байта на набор битов не является проблемой памяти IMHO. Учтите, что набор данных уже является наиболее эффективной структурой данных для хранения информации такого типа, поэтому вам придется оценивать потери в процентах от общего размера структуры.
Для 1025 битов этот подход использует 132 байта вместо 129, для 2,3% служебных данных (и это уменьшается по мере роста сайта битов). Звучит разумно, учитывая возможные преимущества в производительности.