Сделай что-нибудь подобное
std::vector<bool> a;
a.push_back(true);
a.push_back(false);
//...
for (auto it = a.begin(); it != a.end();) // see 0x for meaning of auto
{
unsigned b = 0;
for (int i = 0; i < 8*sizeof(b); ++i)
{
b |= (*it & 1) << (8*sizeof(b) - 1 - i);
++it;
}
// flush 'b'
}
Итак, в итоге вы группируете куски битов, здесь я решил сгруппировать биты в собственные целые числа (что является оптимальным для целевой платформы). Я не проверяю индексы здесь, но это то, что вам придется сделать. Что я хотел бы сделать, так это проверить, сколько полных кусков я мог бы извлечь сначала, сделать это, а затем обработать любой остаток.
Также обратите внимание, что я заполняю биты слева направо (предполагая, что целевая архитектура имеет младший порядок), это означает, что сначала нужно заполнить msb.
Если вы делаете битовые манипуляции и все в таком духе, определите схему упаковки битов, и пусть это будет ваша структура данных. std :: bit_vector, std :: vector или :: dequeue на самом деле не имеют значения. Осторожно упакуйте свои биты в собственный целочисленный тип целевой платформы, что обеспечит наилучшую производительность.