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

标签 c++ bit huffman-code

我有一个例子:

string str = "01100111 011011 011 0110011011 0111101 "

没有数据类型可以保存位。

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

BYTE* store = new BYTE[3];

其次,放入二进制代码<- 我不会编码。

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

如何编码?

最佳答案

您有几个选择:

1) 使用std::vector<bool>

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

有一个缺点是必须通过引用类才能直接访问位,并使用带 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 来表示位。不过,您仍然必须使用位移运算符。

关于c++ - 如何存储霍夫曼变换后的二进制代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49859204/

相关文章:

c++ - cmake 链接到静态库 - 你必须告诉 cmake 去哪里找吗?

c++ - 为什么 find-utils 中的 find 程序上的 execl(...) 不会输出任何内容?

计算二进制中相邻对的数量

c++ - Seekg(ios::beg) 不返回到重定向输入的开头

python - 如何将字节数组转换为字符串?

c++ - 这个指针和性能损失

c++ - 为 std::tuple 重载类型转换运算符

java - 为什么使用位移而不是 for 循环?

C 在内存中写入位

c++ - 在文本压缩期间存储概率表