【发布时间】:2010-10-17 15:59:35
【问题描述】:
我正在尝试实现用于压缩的霍夫曼算法,这需要将可变长度的位写入文件。 C++中有没有办法将1位粒度的可变长度数据写入文件?
【问题讨论】:
标签: c++ compression huffman-code
我正在尝试实现用于压缩的霍夫曼算法,这需要将可变长度的位写入文件。 C++中有没有办法将1位粒度的可变长度数据写入文件?
【问题讨论】:
标签: c++ compression huffman-code
不,您可以写入文件的最小数据量是一个字节。
您可以使用bitset 使操作位更容易,然后使用ofstream 写入文件。如果您不想使用 bitset,可以使用bitwise operators 在保存数据之前对其进行操作。
【讨论】:
您可以访问和保存的最小位数是 8 = 1 个字节。您可以使用位运算符 ^ & | 访问字节中的位。
您可以使用以下方法将第 n 位设置为 1:
my_byte = my_byte | (1 << n);
其中 n 为 0 到 7。
您可以使用以下方法将第 n 位设置为 0:
my_byte = my_byte & ((~1) << n);
您可以使用以下方式切换第 n 位:
my_byte = my_byte ^ (1 << n);
更多详情here.
【讨论】:
klew 的答案可能是您想要的答案,但只是为 Bill 所说的添加一些内容,Boost 库有一个 dynamic_bitset ,我发现它在类似情况下很有帮助。
【讨论】:
您需要的所有关于比特旋转的信息都在这里:
How do you set, clear, and toggle a single bit?
但是您可以放入文件中的最小对象是一个字节。
我会使用 dynamic_bitset ,每次大小大于 8 时,将底部的 8 位提取到一个字符中并将其写入文件,然后将剩余的位向下移动 8 位(重复)。
【讨论】:
没有。您将不得不打包字节。因此,您需要在文件中指定一个标头来指定文件中有多少元素,因为您可能有未使用的尾随位。
【讨论】: