0

C ++でビットセットをファイルに書き込む(おそらくiostreamを使用して)スペースを節約するにはどうすればよいか疑問に思っていました。ビットセットをサイズ 8 のビットセットに分割し、個々のビットセットをファイルに書き込むと、スペースを節約できますか? これについてどう思いますか。これがデータ圧縮の意図です。

4

2 に答える 2

0

通常、ビットセットにビットごとに1バイトを書き込む場合、はい、1バイトに8要素を格納すると、制限内のスペースの7/8を節約できます(もちろん、ビットセットのサイズをどこかに格納する必要があります)。

たとえば、これはbitsetビットごとに 1 文字を使用して書き込みます (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 に答える