C ++ bool数组为bitfield?

时间:2009-11-20 18:29:29

标签: c++ struct boolean bit-fields

让我说我需要在一个结构中存储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)

感谢您的帮助!

4 个答案:

答案 0 :(得分:10)

我建议使用std::bitset这样你只需声明:

std::bitset<8> asdf;

并与[]一起使用。

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

正常情况下,bitfield / bit twiddling方法的合法和可接受的用途是当你必须处理硬件寄存器并试图建模硬件寄存器或实际访问硬件寄存器后使其看起来像一个内存位置并叠加寄存器上的位域结构。

答案 3 :(得分:-1)

您可以让编译器按照您的意愿执行操作,但遗憾的是它不是必需的。例如,即使是接受上述内容的好的编译器也可能最终为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”等与它一起按位工作。