我想知道如何在c ++中节省将bitset写入文件(可能使用iostream)的空间。将bitset分解为大小为8的bitset然后将每个单独的bitset写入文件可以节省空间吗?你对此有何看法?这是数据压缩的目的。
答案 0 :(得分:0)
如果你通常在bitset中每位写一个字节,那么是的,将8个元素存储到一个字节将为你节省7/8的空间(你必须在某处存储bitset的大小,疗程)。
例如,这会使用每位一个字符(7/8开销)写bitset
:
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>
。
答案 1 :(得分:0)
如果您使用boost::dynamic_bitset
,则可以指定基础块的类型,并使用to_block_range
和from_block_range
函数检索它们。
http://www.boost.org/doc/libs/1_46_0/libs/dynamic_bitset/dynamic_bitset.html#to_block_range
(例如,使用unsigned char
作为块类型并以二进制模式将它们存储在流中)