std::vector<unsigned char>
これは、一度に 1 ビットずつ読み書きすることによる の明示的な作成に基づく可能なアプローチです...
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);
速度を本当に気にする場合、何かを得る 1 つの解決策は、たとえば一度に 1 バイトずつパッキングが行われるようにループの展開を行うことですが、さらに良いのは、内部を隠さない独自のビットセット実装を作成することです。を使用する代わりにバイナリ表現std::bitset
。