Это возможный подход, основанный на явном создании std::vector<unsigned char>
путем чтения / записи по одному биту за раз ...
template<size_t N>
std::vector<unsigned char> bitset_to_bytes(const std::bitset<N>& bs)
{
std::vector<unsigned char> result((N + 7) >> 3);
for (int j=0; j<int(N); j++)
result[j>>3] |= (bs[j] << (j & 7));
return result;
}
template<size_t N>
std::bitset<N> bitset_from_bytes(const std::vector<unsigned char>& buf)
{
assert(buf.size() == ((N + 7) >> 3));
std::bitset<N> result;
for (int j=0; j<int(N); j++)
result[j] = ((buf[j>>3] >> (j & 7)) & 1);
return result;
}
Обратите внимание, что для вызова функции шаблона десериализации bitset_from_bytes
размер набора битов N
должен быть указан в вызове функции, например
std::bitset<N> bs1;
...
std::vector<unsigned char> buffer = bitset_to_bytes(bs1);
...
std::bitset<N> bs2 = bitset_from_bytes<N>(buffer);
Если вы действительно заботитесь о скорости, то одно решение, которое получит что-то, будет делать развертывание цикла, чтобы упаковка выполнялась, например, по одному байту за раз, но еще лучше написать собственную реализацию набора битов, которая не скрыть внутреннее двоичное представление вместо использования std::bitset
.