[英]How to store Huffman's transformed binary code?
我有一个例子:
string str = "01100111 011011 011 0110011011 0111101 "
没有数据类型可以保留一点。
首先,我动态分配了三个字节;
BYTE* store = new BYTE[3];
其次,将二进制代码<-我无法对此进行编码。
第三,如果它大于指定的大小,则增加3个字节。
我该如何编码?
您有几种选择:
std::vector<bool>
这可能是最类似于C ++的方式。 std::vector
专门用于bool
,它将每个布尔值存储为一点。 它还为您分配了内存,因此,如果有更多位,您不必担心调整向量的大小。
有一个缺点是必须通过引用类直接访问位,并且将带有std::vector<bool>
按位运算符使用有点尴尬。
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
表示位。 不过,您仍然必须使用按位移位运算符。
标准库中有一个数据类型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空间高效的方式(以及是否对其进行了优化)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.