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

我在输入期间分配/保存中间阶段时遇到问题。所以我做了一个小测试,比如

char buf = 0;

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

但不明白为什么我不能保存中间阶段。其输出将是:
2"happy face"

代替
22

你能教我如何保存中间阶段吗?

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

最佳答案

原因有点棘手 - 它与您写出到 cout 的表达式的类型有关,而不是与您作为按位表达式的结果获得的值有关。

在第一种情况下,表达式是 (buf | (1 << 1)) 。根据 C++ 的规则,这个表达式的类型为 int : OR 的左侧被扩展以匹配右侧。

在第二种情况下,表达式的类型是 char ,因为操作已经完成,并且结果已经转换回 char

这就是为什么第一个值被解释为一个数字,而第二个值被解释为一个 ASCII 字符代码 2,当在您的系统上打印时,它对应于 ☺。添加类型转换应该可以解决这个问题。

关于c++ - C++ 中的位缓冲区,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20002921/

10-14 20:17