我正在尝试为我的霍夫曼编码构建一个打包器。
由于霍夫曼编码的性质,我有以下形式的字符串:01001,它们是可变长度的。我想将这些包装在整数中以节省空间。
以下是我在main
中所做的事情:
bitpack.pack(found->second, found->second.size());
在我的bitpack里面我正在做
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,我只想转移。这样我就可以将比特装入我的整数和一次
CODE UPDATED
答案 0 :(得分:2)
这里有一个问题:
buffer << 1;
什么都不做。这就像写x + 1
或y % 7
;它返回结果但不修改变量的值。我相信你在找
buffer <<= 1;
或
buffer = buffer << 1;
我不熟悉霍夫曼编码,但这是代码逻辑的一个明显问题。
另外
buffer << 0;
甚至
buffer <<= 0;
无效(它将buffer
移位零位)。那条线应该做什么?
答案 1 :(得分:1)
请尝试buffer=buffer<<1;
移位(或实际需要多少位)。
无论你想做什么,请注意:buffer << 0;
什么都不做(关于缓冲区值)
答案 2 :(得分:1)
此行,移位buffer
但不存储移位器值
buffer << 1;
你应该使用这样的东西
buffer <<= 1;