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