C言語 struct bit ビットフィールドとは?

今回は、ビットフィールドについて説明していきます。

/* ビットフィールドを宣言 */
struct bit{
      unsigned int b1 : 1;
      unsigned int b2 : 2;
      unsigned int b3 : 3;
      unsigned int b4 : 4;
      unsigned int b5 : 5;
};

通常はバイト単位でしか変数を使えませんが、
これをビット単位で処理可能にする機能がビットフィールドです。

キーワードは、構造体と同じく struct を使います。
記述法は、変数名の後に、コロンで区切って確保するビット数を指定します。

確保される領域は、データ型の大きさによって変わります。

また、プログラム内での使い方は、構造体と同じです。


今度は、変数名が無名になっている場合です。

/* ビットフィールドを宣言 */
struct bit{
      unsigned int b1  : 1;
      unsigned int b2  : 2;
      unsigned int      : 0;
      unsigned int b4  : 4;
      unsigned int b5  : 5;
      unsigned int      : 1;
      unsigned int b7  : 7;
};

変数名が無名で、ビット幅が0となっている場合、
ここで、一旦、メモリ確保を区切ります。と言う意味になります。

内部処理的な問題なので、あまり気にしなくても問題ありません。

次に変数名が無名で、ビット幅が0以外 となっている場合ですが、
これはそのままの意味で、指定されたビット数は確保しますが、
アクセス不能です。

主に、プログラムの元となる仕様によって、
ビットの並びを揃えたい場合などに用いられます。

また、ビットフィールドは構造体機能の一部なので、
構造体の中には、
普通の変数とビットフィールドを混ぜて宣言してもOKです。