這是一種基於明確創建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);
如果你真的關心速度一個解決方案,將獲得有些東西會做一個循環展開,以便一次完成一個字節的打包,但更好的做法是編寫自己的bitset實現,而不是隱藏內部二進制表示,而不是使用std::bitset
。
Big Endian或Little Endian?有很大的區別(又名排序)? – 2011-03-09 20:00:39
不是。如果bitset被保存爲一個字符數組,那麼對Endianess沒有直接的影響。 – 2011-03-10 20:54:47