霍夫曼编码

7

我正在尝试实现用于压缩的哈夫曼算法,这需要将可变长度的位写入文件。在C++中是否有一种方法可以以1位粒度写入可变长度数据到文件中?

5个回答

9
不,你可以写入文件的最小数据量是一个字节。
你可以使用 bitset 让位操作更容易,然后使用 ofstream 写入文件。如果您不想使用 bitset,则可以在保存数据之前使用 位运算符 操作数据。

3

您可以访问和保存的最小位数为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);

更多细节在这里


2
klew的回答可能是你想要的,但为了补充Bill所说的内容,Boost库有一个dynamic_bitset,在类似的情况下我发现它很有用。请参考dynamic_bitset

2

以下是关于位操作的所有信息:
如何在C语言中设置、清除和切换单个位?

但是,可以在文件中放置的最小对象是一个字节。
我建议使用dynamic_bitset,每当其大小超过8时,提取底部的8个位到一个char类型变量并将其写入文件,然后将剩余的位向下移动8个位置(重复此操作)。


1
不行。您必须打包字节。因此,您需要在文件中添加一个头,以指定文件中有多少个元素,因为您很可能有未使用的尾随位。

你不必计算文件中元素的数量,eof特殊字符可能就足够了。 - Xavier Combelle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接