目次
ビットフィールドとは
あまり使われず、多くの参考書にも載っていないので、あまり重要な項目ではありませんが、ここではビットフィールドについて解説します。
ビットフィールドは、データのサイズをビット単位で扱うことが出来ます。
例えば、サイズが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の各ビットを示していることになります。
構造体、共用体についてはこちら。