4

假设我需要在一个结构中存储 8 个布尔值,但我只想一起使用 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)
    ...

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

好的 - 但是是否也可以创建一个由 8 个布尔值组成的静态数组,这样它们将只使用 8 位,但我仍然可以通过索引来寻址它们?

就像是

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

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

谢谢您的帮助!

4

4 回答 4

10

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

std::bitset<8> asdf;

并与 [] 一起使用。

asdf[0] = true;
asdf[3] = false;
于 2009-11-20T18:42:19.190 回答
1

您不是更愿意使用byte数据类型来同时保存所有内容吗?然后你只需要使用逻辑ANDs 和ORs 来获取/放入东西。不需要struct

于 2009-11-20T18:39:42.120 回答
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);

...现在您有了一个单字节位掩码,以及按位使用的运算符“and”、“or”、“xor”等。

于 2009-11-20T18:55:11.397 回答
0

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

要回答您的直接问题,如果您想做 bool/bitfield 的事情,您必须使用您的第一种方法。

通常,位域/位旋转方法的合法和可接受的用途是当您必须处理硬件寄存器并尝试对硬件寄存器进行建模或在使其看起来像内存位置并叠加位域之后实际访问硬件寄存器时结构上的寄存器。

于 2009-11-20T18:42:17.833 回答