Если вы обычно записываете один байт на бит в наборе битов, тогда да, сохранение восьми элементов в байте сэкономит вам 7/8 пространства в пределе (вам придется где-то хранить размер набора битов, Конечно).
Например, здесь записывается bitset
с использованием одного символа на бит (7/8 служебных данных):
for (size_t i=0, n=bs.size(); i<n; ++i)
stream << bs[i];
, в то время как это сохраняет его оптимально компактным (если не учитывать заполнение в конце):
for (size_t i=0, n=(bs.size() + 1) % 8; i<n; ++i) {
uint8_t byte=0;
for (size_t j=0; j<8; ++j)
byte = (byte << 1) | bs[i*8 + j];
stream << byte;
}
Обратите внимание, что uint8_t
не является стандартным C ++ 03. Он находится в C99 <stdint.h>
или C ++ 0x <cstdint>
. Вы также можете использовать std::bitset<8>
, если хотите.