我正在从文件中读取大量整数。它们都是 0 或 1,因此我已将每个读取的整数转换为 boolean 值。
我需要做的是通过将每 8 位/boolean 值打包到一个字符中来利用字符提供的空间(8 位)。我怎样才能做到这一点?
我尝试过二进制运算,但没有得到我想要的结果。
int count = 7;
unsigned char compressedValue = 0x00;
while(/*Not end of file*/)
{
...
compressedValue |= booleanValue << count;
count--;
if (count == 0)
{
count = 7;
//write char to stream
compressedValue &= 0;
}
}
更新
我已经更新了代码以反射(reflect)迄今为止建议的一些更正。我的下一个问题是,我应该如何初始化/清除无符号字符?
更新
反射(reflect)了清除字符位的更改。
谢谢大家的帮助。
最佳答案
几点说明:
-
while(!in.eof())
是错误的,您必须首先尝试(!)读取某些内容,如果成功,您就可以使用该数据。 - 使用无符号字符来获取至少八位的整数。或者,查看 stdint.h 并使用 uint8_t (或 uint_least8_t)。
- 移位操作方向错误,使用
uint8_t(1) << count
相反。 - 如果你想在内存中做类似的事情,我会使用更大的类型,比如 32 或 64 位,因为读取一个字节仍然是单个 RAM 访问,即使一次可以读取多于一个字节.
- 写入一个字节后,不要忘记将临时值清零。
关于C++ 将八个 boolean 值压缩为一个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14509679/