繁体   English   中英

C ++ bool数组为bitfield?

[英]C++ bool array as bitfield?

假设我需要在结构中存储8个bool,但是我想一起使用它们只有1个字节,那么我可以这样做:

struct myStruct {
    bool b1:1;
    bool b2:1;
    bool b3:1;
    bool b4:1;
    bool b5:1;
    bool b6:1;
    bool b7:1;
    bool b8:1;
};

有了这个我可以做的事情

myStruct asdf;
asdf.b3=true;
asdf.b4=false;
if(asdf.b1)
    ...

到目前为止这是正确的吗? (我实际上并不知道,我之前从未使用过bitfields)

好的 - 但是也可以创建一个8个bool的静态数组,这样它们只能使用8位但是我仍然可以通过索引来加入它们吗?

就像是

struct myStruct {
public:
    bool b[8]:8;
};

也许? (有了这个,我得到一个错误C2033)

谢谢您的帮助!

我建议使用std::bitset这样你就可以简单地声明:

std::bitset<8> asdf;

并与[]一起使用。

asdf[0] = true;
asdf[3] = false;

您是否宁愿使用byte数据类型一次保存所有内容? 然后你只需要使用逻辑ANDOR来获取/放入内容。 不需要struct

出于各种原因,我认为这不是一个好主意 - 你基本上试图复制vector<bool>的行为,这已被证明不是一个好主意 如果您只是为了节省内存而尝试这样做,我不会打扰。 访问各种bool并从位字段中提取它们的开销可能比你保存的小内存高很多,除非你受到内存限制的极大限制。

要回答你的直接问题,如果你想做bool / bitfield事情,你将不得不使用你的第一种方法。

通常,当你必须处理硬件寄存器并试图建模硬件寄存器或实际访问硬件寄存器之后,使其看起来像存储器位置并叠加位字段时,合法和可接受的用途是bitfield / bit twiddling方法寄存器上的结构。

您可以让编译器按照您的意愿执行操作,但遗憾的是它不是必需的。 例如,即使一个接受上述内容的好编译器也可能最终为myStruct对象分配一个完整的32位字。

如果您有选项,并且您希望对类型以及它们的对齐和分配方式进行控制,那么您应该考虑使用Ada。 例如,以下在Ada中工作得很好:

type Bit_Set is array (1..8) of Boolean;
for Bit_Set'size use 8;

High_Mask : constant Bit_Set := (1..7 => false, 8 => true);

...现在你有一个单字节的位掩码,以及与它一致的运算符“和”,“或”,“xor”等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM