C++ 按位操作是否有助于我序列化一些布尔值?

C++ 按位操作是否有助于我序列化一些布尔值?,c++,bit-manipulation,binaryfiles,C++,Bit Manipulation,Binaryfiles,我不习惯二进制文件,我正在努力掌握它的窍门。我设法存储了一些整数和无符号字符,并且毫不费力地读取它们。现在,当我试图保存一些布尔值时,我看到我的每个布尔值在我的文件中正好有一个八位字节,这似乎是合乎逻辑的,因为一个单独的布尔值存储在一个字符大小的数据中(如果我错了,请纠正我!) 但是因为我将有3到4个bool要序列化,所以我认为像这样存储它们是一种浪费:00000001 00000001 00000000,例如,当我可以有00000110时。我想为了得到这个,我应该使用位运算,但我对它们不是很在

我不习惯二进制文件,我正在努力掌握它的窍门。我设法存储了一些整数和无符号字符,并且毫不费力地读取它们。现在,当我试图保存一些布尔值时,我看到我的每个布尔值在我的文件中正好有一个八位字节,这似乎是合乎逻辑的,因为一个单独的布尔值存储在一个字符大小的数据中(如果我错了,请纠正我!)

但是因为我将有3到4个bool要序列化,所以我认为像这样存储它们是一种浪费:00000001 00000001 00000000,例如,当我可以有00000110时。我想为了得到这个,我应该使用位运算,但我对它们不是很在行。。。谁能告诉我:

  • 如何使用位操作在单个八位字节中存储多达8个布尔值
  • 如何使用位操作从单个八位组中为(最多8个布尔值)提供适当的值
  • (还有一个额外的问题,有没有人能推荐一个简单的,非数学导向的思维,像我的,位操作教程,如果存在的话?我发现我理解但不能付诸实践的一切…)

  • 我使用C++,但是我猜想大多数C同构语言都会使用相同的操作。

    < P>简单的方法是使用STD::BITSET,它允许你使用索引来访问单个位(BOOLS),然后将得到的值作为整数。它还允许反向操作

    int main() {
      std::bitset<8> s;
      s[1] = s[2] = true;  // 0b_0000_0110
      cout << s.to_ulong() << '\n';
    }
    
    intmain(){
    std::位集s;
    s[1]=s[2]=true;//0b_0000_0110
    
    无法将布尔值存储在一个字节中:

    bool flag; // value to store
    unsigned char b = 0; // all false
    int position; // ranges from 0..7
    b = b | (flag << position);
    
    bool标志;//要存储的值
    无符号字符b=0;//全部为false
    int位置;//范围为0..7
    
    b=b |(标志无需包装在花式模板/预处理器机械中:


    • 设置变量中的第3位:
      var |=(1尝试按顺序读取此值

    • 有些人会认为第二个链接太死板了,但一旦你掌握了简单的操作,它就会派上用场。

      首先是基本内容:

      • 表示false的位的唯一组合是00000000,其他所有位的组合都表示true,即:00001010000101
      • 00000000=0(十进制),00000001=2^0,00000010=2^1,00000100=2^2,…,10000000=2^7
      • 操作数(&&,| |)和(&,|)之间有很大区别。第一个操作数给出两个数字之间逻辑运算的结果,例如:

        00000000&&00000000=false

        01010101&&10101010=真

        000011100 | | 00000000=真

        00000000 | | 00000000=假

        第二对进行逐位运算(数字的每一位之间的逻辑运算):

        00000000&00000000=00000000=false

        000011111&11110000=00000000=false

        01010101&10101001=00000001=true

        00001111 | 11110000=11111111=真

        000011100 | 00000011=00001111=true


      要使用此功能并使用位,您只需了解一些基本技巧:

      • 要将位设置为1,您需要使用八位字节进行操作,该八位字节的位置为1,其余位置为ceros
      例如:我们希望八位组A的第一位是1,我们制作:A | 0000000 1

      • 要将位设置为0,就要进行操作&在该位置有一个0,其余位置有一个
      例如:我们希望八位字节A的最后一位为0,我们制作:A&01111111

      • 要获得保存位的布尔值,需要进行操作&在该位置有一个1的八位组,其余位置有一个ceros

      例如:我们希望看到八位字节A的第三位的值,我们制作:A&00000100,如果A是XXXXX 1x,我们得到00000100=true,如果A是XXXXX 0xX,我们得到00000000=false;

      您可以始终序列化位字段。类似于:

      struct bools 
      {
          bool a:1;
          bool b:1;
          bool c:1;
          bool d:1;
      };
      

      有一个1的大小。

      你在按位运算的哪些方面有困难?这说明了如何做,但也许一些解释也会有帮助,因为OP似乎不确定它背后的逻辑。你应该从0开始计数,而不是从1开始。@ralu:嗯?我想你会发现我有。“第3位”上面提到的是第四位,是吗?我不知道std::bitset,非常感谢你让我发现它。但是,我需要一个无符号字符,甚至认为我可以转换为int,然后转换为uchar,我将执行非强制转换操作。@Raveline:从ulong到无符号字符的强制转换在这里不是问题。到bit Twiddli的链接很棒ng Hacks.TVM
      struct bools 
      {
          bool a:1;
          bool b:1;
          bool c:1;
          bool d:1;
      };