4

ビットパックされた構造体の中に配列を入れたいです。私は配列のサイズ (32) を静的に知っており、配列内の各要素を 1 ビットにしたいと考えています。たとえば、次のようなことが言えるようになりたいです。

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 でのすべての配列アクセスはポインター演算と逆参照です)。ただし、より大きな型のビットを使用して独自のビット配列をコーディングするのは簡単です。ジェイソンは基本を説明しました。一般に、よほどの理由がない限り、ビットフィールドの使用は避けるべきです。彼らは通常、価値があるよりも多くの問題を抱えています。

于 2010-11-28T22:31:48.650 に答える