节省空间将bitset写入C ++中的文件

时间:2011-03-02 20:43:46

标签: c++ iostream bitset data-compression lossless-compression

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

2 个答案:

答案 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_rangefrom_block_range函数检索它们。

http://www.boost.org/doc/libs/1_46_0/libs/dynamic_bitset/dynamic_bitset.html#to_block_range

(例如,使用unsigned char作为块类型并以二进制模式将它们存储在流中)