Adi*_*vit 12 c++ binary stl bitset
std::bitset有一种to_string()序列化为s和s 的char基于字符串的方法.显然,这对于bitset中的每个位使用单个8位,使得序列化表示比所需的长8倍.
我想将bitset存储在二进制表示中以节省空间.仅当我的bitset中少于32位时,该方法才有意义.我有几百个.
我不确定我是否想在对象(地址)本身上使用/ ,因为它假设对象是POD.10charto_ulong()memcpy()std::copy()
API似乎没有提供内部数组表示的句柄,我可以从中获取地址.
我还想选择从二进制表示中反序列化bitset.
我怎样才能做到这一点?
这是一种可能的方法,基于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;
}
Run Code Online (Sandbox Code Playgroud)
请注意,要调用反序列化模板函数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);
Run Code Online (Sandbox Code Playgroud)
如果你真的关心速度一个解决方案将获得一些东西将进行循环展开,以便打包例如一次完成一个字节,但更好的只是编写自己的bitset实现,不隐藏内部二进制表示而不是使用std::bitset.
| 归档时间: |
|
| 查看次数: |
6276 次 |
| 最近记录: |