2013-11-15 152 views
3

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

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

char buf = 0; 

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

但不明白为什么我不能保存中间阶段。 ,它的输出将是:

2"happy face" 

,而不是

22 

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

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

+2

当找不到的时候,你应该尝试使用无符号类型,它在许多情况下使事情变得更容易。 – PlasmaHH

回答

3

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

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

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

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

2

要设置一个特定位,你可以使用此代码:

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

要看到什么是在buf将其转换为int,否则你会看到字符:

std::cout << int(buf); 

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