2

我正在从文件中读取大量整数。它们都将是 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?

更新

反映了清除字符位的更改。

谢谢大家的帮助。

4

3 回答 3

3

几个注意事项:

  • while(!in.eof())错了,您必须先尝试(!)读取某些内容,如果成功,您可以使用数据。
  • 使用 unsigned char 获取至少 8 位的整数。或者,查看 stdint.h 并使用 uint8_t(或 uint_least8_t)。
  • 移位操作方向错误,uint8_t(1) << count改用。
  • 如果你想在内存中做类似的事情,我会使用更大的类型,比如 32 位或 64 位,因为读取一个字节仍然是单个 RAM 访问,即使一次可以读取多个字节。
  • 写入一个字节后,不要忘记将临时值归零。
于 2013-01-24T20:09:51.983 回答
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 
于 2013-01-24T21:22:48.770 回答
-2

vector<bool>以您想要的方式包装的标准保证。不要重新发明轮子。更多信息在这里

于 2013-01-24T20:12:22.563 回答