C++中的位缓冲区

3

我正在做一个任务,需要将位写入缓冲区,一旦缓冲区填满8位,就需要进行刷新。(哈夫曼压缩)

我在输入过程中保存中间阶段时遇到了问题。所以我进行了一个小测试,例如

char buf = 0;

cout << (buf | (1 << 1));
buf = (buf | (1 << 1));
cout << buf;

但是我不明白为什么无法保存中间阶段。输出结果如下:
2"happy face"

替代

22

请问您能教我如何保存中间阶段吗?

基本上,我需要逐位写入缓冲区,一旦缓冲区达到一个字节,我就会将其刷新到输出文件中。


3
在进行位操作时,建议使用无符号类型,这在许多情况下可以使事情变得更加容易。 - PlasmaHH
2个回答

3
原因有点棘手 - 它与您写入 cout 的表达式类型有关,而不是位运算表达式的结果值。
在第一个案例中,表达式为 (buf | (1 << 1))。根据 C++ 的规则,该表达式的类型为 int: 左侧的 OR 被扩展以匹配右侧。
在第二种情况下,表达式的类型为 char,因为操作已经完成,结果已被转换回 char
这就是为什么第一个值被解释为数字,而第二个值被解释为对应于 ☺ 的 ASCII 字符代码2。添加一个强制转换应该可以解决这个问题。

2

要设置特定的位,您可以使用以下代码:

buf |= 1 << n; // where n is bit number from 0 to 7

要查看buf中的内容,请将其转换为int,否则您将看到字符:

std::cout << int( buf );

或者通过一个函数将其转换为二进制字符串。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接