0

ハフマン符号化用のビットパッカーを作成しようとしています。

ハフマン符号化の性質上、可変長の01001の形式の文字列があります。スペースを節約するために、これらを整数にビットパックしたいと思います。

これが私がしていることですmain

bitpack.pack(found->second, found->second.size());

そして私のビットパックの中で私はやっています

void BitPacker::pack(std::string stream, int size)
{
    std::cout << "BitPacker received:\t" << stream.c_str() << "\t" << size << std::endl;
    for(int i = 0; i < size; i++) {
        //if buffer is not full keep shifting
        std::cout << "Buffer index: " << index << std::endl;
        std::bitset<8> binary(buffer);
        std::cout << "Buffer: " << binary << std::endl;

        if(index < 8) {
            if(stream.at(i) == '1') {
                buffer += 1;
                //buffer << 1;
                buffer <<= 1;
                index++;
            }
            else {
                //buffer << 0;
                buffer <<= 1;
                index++;
            }
        }
        //write buffer
        else {
            std::cout << "Writting:\t"<< buffer << std::endl;
            outfile->put(buffer);
            index = 0;
            buffer = 0;
        }
    }
}

しかし、私は何か間違ったことをしているようです。

私がやりたいのは、ストリームを反復処理し、それが1の場合は、ビットを追加してからシフトすることです。0の場合は、シフトしたいだけです。そうすれば、整数にビットを詰め続けることができます。

コードが更新されました

4

3 に答える 3

2

ここに問題があります:

 buffer << 1;

何もしません。それは書くことx + 1y % 7;のようなものです。結果を返しますが、変数の値は変更しません。私はあなたが探していると信じています

buffer <<= 1;

また

buffer = buffer << 1;

私はハフマン符号化に精通していませんが、これはコードのロジックに関する明らかな問題です。

また

buffer << 0;

あるいは

buffer <<= 0;

効果はありません(ゼロビットだけシフトbufferしています)。その行は何をすることになっていますか?

于 2013-03-24T20:50:22.127 に答える
1

シフトしてみてくださいbuffer=buffer<<1;(または実際に必要なビット数)。

あなたがしたいことは何でも注意してください:buffer << 0;何もしません(バッファ値に関して)

于 2013-03-24T20:43:35.350 に答える
1

この行はシフトしますbufferが、シフター値は保存されません

buffer << 1;

あなたはこのようなものを使うべきです

buffer <<= 1;
于 2013-03-24T20:50:12.280 に答える