[英]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.