0

我想知道如何在 C++ 中将位集写入文件(可能使用 iostream)来节省空间。将位集分解为大小为 8 的位集,然后将每个单独的位集写入文件会节省空间吗?你对此有何看法。这就是数据压缩的目的。

4

2 回答 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_rangefrom_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 回答