我想在位压缩结构中有一个数组。我静态地知道数组的大小(32),我希望数组中的每个元素都是一个位。例如,我希望能够这样说:
struct example_s {
// ...
unsigned int flags[32] : 32;
} __attribute__((__packed__));
我已经尝试了几件事,但 gcc 不会让步。能够这样做会很好,这样我就可以编写干净的代码来迭代打包数组中的元素。想法?
我想在位压缩结构中有一个数组。我静态地知道数组的大小(32),我希望数组中的每个元素都是一个位。例如,我希望能够这样说:
struct example_s {
// ...
unsigned int flags[32] : 32;
} __attribute__((__packed__));
我已经尝试了几件事,但 gcc 不会让步。能够这样做会很好,这样我就可以编写干净的代码来迭代打包数组中的元素。想法?
如果您只是将其放入(32 位)int 中,那么您可以使用这样的 for 循环干净地迭代这些位:
for (bit = 0; bit < 32; bit++)
flagValue = ((flags & (1<<bit)) != 0;
编写起来并不比数组索引语法难多少。
如果您希望隐藏位旋转以使代码更具可读性,您甚至可以使用函数或宏来访问位 - 例如GetFlag(bit)
位域成员元素没有地址,因此即使您可以声明它们的数组,也无法使用它(C 中的所有数组访问都是指针算术和解引用)。不过,使用较大类型的位来编写自己的位数组很容易;Jason 已经解释了基础知识。通常,除非您有充分的理由,否则您应该避免使用位域。他们通常比他们的价值更麻烦。