C ++中的位缓冲区

时间:2013-11-15 14:08:33

标签: c++ fstream bit

我正在做一个我需要将位写入缓冲区的赋值,一旦缓冲区填充了8位,我就会刷新。 (霍夫曼压缩)

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

char buf = 0;

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

但不明白为什么我不能保存中间阶段。输出结果如下:

2"happy face"

而不是

22

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

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

2 个答案:

答案 0 :(得分:3)

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

在第一种情况下,表达式为(buf | (1 << 1))。根据C ++的规则,此表达式的类型为intOR的左侧展开以匹配右侧。

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

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

答案 1 :(得分:2)

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

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

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

std::cout << int( buf );

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