C ++将八个布尔值压缩成一个字符

时间:2013-01-24 19:59:49

标签: c++ compression boolean character

我正在从文件中读取大量整数。所有这些都是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?

更新

反映更改以清除字符位。

感谢大家的帮助。

3 个答案:

答案 0 :(得分:3)

几点说明:

  • while(!in.eof())是错误的,您必须先尝试(!)阅读某些内容,如果成功,您可以使用这些数据。
  • 使用unsigned char获取至少8位的整数。或者,查看stdint.h并使用uint8_t(或uint_least8_t)。
  • 班次操作方向错误,请改用uint8_t(1) << count
  • 如果你想在内存中做类似的事情,我会使用更大的类型,比如32或64位,因为读取一个字节仍然是单个RAM访问,即使可以一次读取多于一个字节
  • 写完一个字节后,不要忘记将临时值归零。

答案 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