我正在做一个我需要将位写入缓冲区的赋值,一旦缓冲区填充了8位,我就会刷新。 (霍夫曼压缩)
我在输入过程中分配/保存中间阶段时遇到问题。所以我做了一些测试,比如
char buf = 0;
cout << (buf | (1 << 1));
buf = (buf | (1 << 1));
cout << buf;
但不明白为什么我不能保存中间阶段。输出结果如下:
2"happy face"
而不是
22
你能告诉我如何保存中间阶段吗?
基本上,我需要一点一点地写入缓冲区,一旦缓冲区是一个字节,我会将它刷新到我的输出文件。
答案 0 :(得分:3)
原因有点棘手 - 它与您写入cout
的表达式的类型有关,而不是与按位表达式得到的值有关。
在第一种情况下,表达式为(buf | (1 << 1))
。根据C ++的规则,此表达式的类型为int
:OR
的左侧展开以匹配右侧。
在第二种情况下,表达式的类型为char
,因为操作已完成,结果已转换回char
。
这就是为什么第一个值被解释为数字,而第二个值被解释为ASCII字符代码2,对应于在系统上打印时的☺。添加强制转换可以解决此问题。
答案 1 :(得分:2)
要设置特定位,您可以使用以下代码:
buf |= 1 << n; // where n is bit number from 0 to 7
要查看buf
中的内容将其转换为int,否则您将看到字符:
std::cout << int( buf );
或者通过函数将其转换为二进制字符串。