4

我想在位压缩结构中有一个数组。我静态地知道数组的大小(32),我希望数组中的每个元素都是一个位。例如,我希望能够这样说:

struct example_s {
  // ...
  unsigned int flags[32] : 32;
} __attribute__((__packed__));

我已经尝试了几件事,但 gcc 不会让步。能够这样做会很好,这样我就可以编写干净的代码来迭代打包数组中的元素。想法?

4

2 回答 2

7

如果您只是将其放入(32 位)int 中,那么您可以使用这样的 for 循环干净地迭代这些位:

for (bit = 0; bit < 32; bit++)
    flagValue = ((flags & (1<<bit)) != 0;

编写起来并不比数组索引语法难多少。

如果您希望隐藏位旋转以使代码更具可读性,您甚至可以使用函数或宏来访问位 - 例如GetFlag(bit)

于 2010-11-28T22:24:43.720 回答
1

位域成员元素没有地址,因此即使您可以声明它们的数组,也无法使用它(C 中的所有数组访问都是指针算术和解引用)。不过,使用较大类型的位来编写自己的位数组很容易;Jason 已经解释了基础知识。通常,除非您有充分的理由,否则您应该避免使用位域。他们通常比他们的价值更麻烦。

于 2010-11-28T22:31:48.650 回答