我想知道如何在 C++ 中将位集写入文件(可能使用 iostream)来节省空间。将位集分解为大小为 8 的位集,然后将每个单独的位集写入文件会节省空间吗?你对此有何看法。这就是数据压缩的目的。
问问题
1579 次
2 回答
0
如果您通常在位集中每个位写入一个字节,那么是的,将八个元素存储到一个字节将为您节省 7/8 的限制空间(当然,您必须将位集的大小存储在某处)。
例如,这写入一个bitset
使用一个字符每位(7/8 开销):
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>
。
于 2011-03-02T20:48:42.530 回答
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
用作块类型并以二进制模式将它们存储在流中)
于 2011-03-02T22:13:51.747 回答