我正在做一项任务,我需要将位写入缓冲区,一旦缓冲区填满 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/