目次
ビットフィールドとは
あまり使われず、多くの参考書にも載っていないので、あまり重要な項目ではありませんが、ここではビットフィールドについて解説します。
ビットフィールドは、データのサイズをビット単位で扱うことが出来ます。
例えば、サイズが1ビットの変数を用意できます。
1ビットということは0か1しか値を持ちません。
これは論理値型のフラグとしてつかえます。
また、共用体のメンバとして使うことで、指定した部分をとりだすことができます。
使い方
ビットフィールドは構造体のメンバとして定義します。
以下のように書きます。
【変数型】 【メンバ名】:【ビット数】
これで定義したメンバは、指定したビット数で格納されます。
厳密には、宣言した変数型分のメモリ領域を確保しますが、使えるのは指定したビット数分です。
変数型には主にint、unsigned intが使われます。
連続でビットフィールドを宣言すると、前のビットフィールドに続いて領域を確保します。
サンプルコード
bitfield_sample1.c
#include <stdio.h> struct str { unsigned int a : 1; }; int main(void) { struct str s; s.a = 3; printf("%d", s.a); return 0; }
このサンプルコードでは1ビットのビットフィールドのみを定義しています。
その1ビットの領域に3を代入していますが、結果は1と表示されます。
これは、1ビットのビットフィールドなので2ビット目以降を読まないためです。
bitfield_sample2.c
#include <stdio.h> struct str { unsigned int a0 : 1; unsigned int a1 : 1; unsigned int a2 : 1; unsigned int a3 : 1; unsigned int a4 : 1; unsigned int a5 : 1; unsigned int a6 : 1; unsigned int a7 : 1; }; union chr { char c; struct str a; }; int main(void) { union chr c; c.c = 'a'; printf("%d", c.a.a7); printf("%d", c.a.a6); printf("%d", c.a.a5); printf("%d", c.a.a4); printf("%d", c.a.a3); printf("%d", c.a.a2); printf("%d", c.a.a1); printf("%d", c.a.a0); return 0; }
この例では、8ビットをそれぞれ1ビットずつ分割した構造体を共用体のメンバにしています。
共用体は複数のメンバで領域を共有するので、構造体strはchar型変数cの各ビットを示していることになります。
構造体、共用体についてはこちら。