在 C++ 中将位集写入文件可节省空间

发布于 2024-10-20 09:58:22 字数 104 浏览 1 评论 0原文

我想知道如何在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

方圜几里 2024-10-27 09:58:22

如果您通常在位集中每个位写入一个字节,那么是的,将八个元素存储到一个字节中将为您节省 7/8 的限制空间(当然,您必须在某处存储位集的大小)。

例如,这使用每位一个字符写入一个位集(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 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):

for (size_t i=0, n=bs.size(); i<n; ++i)
    stream << bs[i];

while this stores it optimally compact (if we disregard padding at the end):

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;
}

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 an std::bitset<8> if you want.

嘿哥们儿 2024-10-27 09:58:22

如果您改用 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作为块类型,并以二进制方式存储在流中)

If you use boost::dynamic_bitset instead, you can specify the type of the underlying blocks and retrieve them with to_block_range and from_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)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文