簡體   English   中英

如何存儲霍夫曼變換后的二進制代碼?

[英]How to store Huffman's transformed binary code?

我有一個例子:

string str = "01100111 011011 011 0110011011 0111101 "

沒有數據類型可以保留一點。

首先,我動態分配了三個字節;

BYTE* store = new BYTE[3];

其次,將二進制代碼<-我無法對此進行編碼。

第三,如果它大於指定的大小,則增加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表示位。 不過,您仍然必須使用按位移位運算符。

標准庫中有一個數據類型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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM