【问题标题】:huffman encoding霍夫曼编码
【发布时间】:2010-10-17 15:59:35
【问题描述】:

我正在尝试实现用于压缩的霍夫曼算法,这需要将可变长度的位写入文件。 C++中有没有办法将1位粒度的可变长度数据写入文件?

【问题讨论】:

    标签: c++ compression huffman-code


    【解决方案1】:

    不,您可以写入文件的最小数据量是一个字节。

    您可以使用bitset 使操作位更容易,然后使用ofstream 写入文件。如果您不想使用 bitset,可以使用bitwise operators 在保存数据之前对其进行操作。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        klew 的答案可能是您想要的答案,但只是为 Bill 所说的添加一些内容,Boost 库有一个 dynamic_bitset ,我发现它在类似情况下很有帮助。

        【讨论】:

          【解决方案4】:

          您需要的所有关于比特旋转的信息都在这里:
          How do you set, clear, and toggle a single bit?

          但是您可以放入文件中的最小对象是一个字节。
          我会使用 dynamic_bitset ,每次大小大于 8 时,将底部的 8 位提取到一个字符中并将其写入文件,然后将剩余的位向下移动 8 位(重复)。

          【讨论】:

            【解决方案5】:

            没有。您将不得不打包字节。因此,您需要在文件中指定一个标头来指定文件中有多少元素,因为您可能有未使用的尾随位。

            【讨论】:

            • 您不必计算文件中 eof 特殊字符可能符合要求的元素数量
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多