如何存储霍夫曼的变换二进制代码?

时间:2018-04-16 14:02:14

标签: c++ bit huffman-code

我有一个例子:

string str = "01100111 011011 011 0110011011 0111101 "

没有数据类型可以保留一点。

首先,我动态分配三个字节;

BYTE* store = new BYTE[3];

其次,把二进制代码< - 我不能编码。

第三,如果它大于指定的大小,则增加3个字节。

我如何编码?

2 个答案:

答案 0 :(得分:3)

您有几个选择:

1)使用std::vector<bool>

这可能是最像C ++的方式。 std::vector专门用于bool,它将每个布尔值存储为一个位。它还为您分配内存,因此如果有更多位,您不必担心调整向量的大小。

有一个缺点是必须通过引用类直接访问这些位,而使用std::vector<bool>的按位运算符有点尴尬。

2)按位移位运算符

C ++还有可用于移动位的运算符<<>><<=>>=<<运算符将所有位移到左侧,>>将它们向右移位。 <<=>>=<<>>相同,+=+相同。

以下是他们的一个例子:

unsigned char bits = 0b10010010 // uses binary literal syntax
bits <<= 1 // each bit in the variable is shifted left by one, making
           // the bits be `00100100`. Note that the overflow is ignored.

bits >>= 2 // bits is now `00001001`

您可以将这些与AND和OR运算符(|&)结合使用来操作位。

此外,虽然这并不能完全解决您的问题,但您还可以使用std::bitset来表示位。您仍然必须使用按位移位运算符。

答案 1 :(得分:1)

标准库中有一个数据类型std::bitset;不幸的是,它的大小必须是constexpr,因此您无法动态定义它(例如,取决于您的内容/字符串的大小)。

实现所需行为的一种方法是使用std::vector<bool>

int main() {
    string str = "01100111 011011 011 0110011011 0111101 ";

    //bitset<70> bits(str); // requires 70 as constexpr

    vector<bool> bits;
    for (auto c : str) {
        if (c=='1')
            bits.push_back(true);
        else if (c=='0')
            bits.push_back(false);
        else {
            // ignore
        }
    }

    for (auto bit : bits) {
        cout << bit;
    }

}

请注意,数据类型vector<bool>可能针对速度/内存消耗进行了优化,但并非必须(参见,例如,cppreference.com - vector):

  

std :: vector的空间效率(也是如此)   至于它是否完全优化)是实现定义。