在 C++ 中将位集写入文件可节省空间
我想知道如何在 C++ 中将位集写入文件(可能使用 iostream)来节省空间。将位集分解为大小为 8 的位集,然后将每个单独的位集写入文件会节省空间吗?你对此有何想法。这就是数据压缩的目的。
I was wondering how I can save space writing a bitset to a file ( probably using iostream) in c++. Will breaking up the bitset into bitset of size 8 and then writing each individual bitset to the file save me space? What is your thought about this. This is the intention of data compression.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
如果您通常在位集中每个位写入一个字节,那么是的,将八个元素存储到一个字节中将为您节省 7/8 的限制空间(当然,您必须在某处存储位集的大小)。
例如,这使用每位一个字符写入一个位集(7/8 开销):
同时以最佳紧凑方式存储它(如果我们忽略末尾的填充):
请注意,uint8_t code> 不是标准 C++03。它驻留在 C99 的
或 C++0x 的
中。如果需要,您还可以使用std::bitset<8>
。If you normally write one byte per bit in the bitset, then yes, storing eight elements to a byte will save you 7/8 of the space in the limit (you will have to store the size of the bitset somewhere, of course).
For example, this writes a
bitset
using one character per bit (7/8 overhead):while this stores it optimally compact (if we disregard padding at the end):
Note that
uint8_t
is not standard C++03. It resides in C99's<stdint.h>
or C++0x's<cstdint>
. You can also use anstd::bitset<8>
if you want.如果您改用
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
作为块类型,并以二进制方式存储在流中)If you use
boost::dynamic_bitset
instead, you can specify the type of the underlying blocks and retrieve them withto_block_range
andfrom_block_range
functions.http://www.boost.org/doc/libs/1_46_0/libs/dynamic_bitset/dynamic_bitset.html#to_block_range
(for example, use
unsigned char
as block type and store them in a stream in binary mode)