STL位集支持值字段吗?

时间:2018-07-08 04:15:38

标签: c++ stl bit-manipulation

当前,我正在使用位字段来表示c ++中的标志寄存器:

struct DEVICE_REGISTER  {
     unsigned ready:1;        // 1 if device is ready
     unsigned error:1;        // 1 if an error occurred.
     unsigned bus_address:4;  // up to 16 possible drives on bus
     unsigned command:2;      // up to 4 different commands
     unsigned error_code:8;
};

执行按位操作是干净,容易和直观的:

{
    dev_reg->bus_address = 1;
    dev_reg->command = CmdReset;

    /* wait until operation done, ready will be true */

    while ( ! dev_reg->ready ) ;

    /* check for errors */

    if (dev_reg->error)
      { /* interrogate disk_reg->error_code for error type */
        switch (dev_reg->error_code)
        ......
      }
}

但是,我想使用STL的bitset<>来提高效率,但是我找不到如何将位段声明为按名称引用的数据字段的方法。以下显然不起作用:

struct DEVICE_REGISTER  {
     bitset<1> ready;        // 1 if device is ready
     bitset<1> error;        // 1 if an error occurred.
     bitset<4> bus_address;  // up to 16 possible drives on bus
     bitset<2> command;      // up to 4 different commands
     bitset<8> error_code;
};

if (dev_reg->error_code)
     dev_reg->error_code = 0; // clear the error codes
     dev_reg->error = 0;
     resend(dev_reg);  // resend the register 
}; 

如果bitset<>不支持此功能,那么我很难看到使用它的真正好处。在拥有更紧凑的数据结构的过程中,您将损失代码量,复杂性,可读性和可靠性。根据值的位置和大小而不是命名字段来引用值很容易发生人为错误,并且需要大量代码体操。

0 个答案:

没有答案