我正在从文件中读取大量整数。所有这些都是0或1,所以我将每个读取整数转换为布尔值。
我需要做的是通过将每8位/布尔值打包成一个字符来利用字符提供的空间(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;
}
}
更新
我已更新代码以反映到目前为止建议的一些更正。我的下一个问题是,我应该如何初始化/清除unsigned char?
更新
反映更改以清除字符位。
感谢大家的帮助。
答案 0 :(得分:3)
几点说明:
while(!in.eof())
是错误的,您必须先尝试(!)阅读某些内容,如果成功,您可以使用这些数据。uint8_t(1) << count
。答案 1 :(得分:1)
正如Mooing Duck建议的那样,你可以使用bitset。
源代码只是概念证明 - 尤其是必须实现文件读取。
#include <bitset>
#include <cstdint>
#include <iostream>
int main() {
char const fcontent[56] { "\0\001\0\001\0\001\0\001\0\001"
"\001\001\001\001\001\001\001\001\001\001\001\001"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\001\0\001\0\001\0\001" };
for( int i { 0 }; i < 56; i += 8 ) {
std::bitset<8> const bs(fcontent+i, 8, '\0', '\001');
std::cout << bs.to_ulong() << " ";
}
std::cout << std::endl;
return 0;
}
输出:
85 127 252 0 0 1 84
答案 2 :(得分:-2)
vector<bool>
以您希望的方式打包的标准保证。不要重新发明轮子。more info here