ビットフィールド

C言語における変数のサイズは最小でもcharの1バイト、8bit分はある・・・。
それに対し、真か偽かを保持するなら1bitで十分である・・・。
こういう場合に、なんとかしてbit単位でメモリ領域を割り当てられないだろうか・・・。

C言語の構造体にはビットフィールドという機能があり、これを使うとビット単位でメンバにメモリを割り当てられる・・・。

struct bf{
  <型> <メンバ名>: <型の中でこのメンバに割り当てるビット数>;
  .
  .
  .
};

こんな感じで定義する・・・。

struct_flagsという構造体に、いろいろな属性を持たせる・・・。
すべてunsigned charとなっているが、実際にはis_adult, is_male, is_sportsman, is_artistには、1ビットずつしか割り当てられていない・・・。
最後のnoは4ビット・・・。
よって、合計8ビットしか使われていない・・・。

sizeof(struct struct_flags)でstruct_flagsのサイズを取得し、出力・・・。

is_adult, is_male, is_sportsman, is_artistは1ビットなので、0か1しかセットできないし、noも4ビットなので0から15までしかセットできない・・・。

全て"%hu"で出力してみる・・・。

$ vi bit_field.c
$ gcc bit_field.c -o bit_field
$ vi bit_field.c
$ gcc bit_field.c -o bit_field
$ ./bit_field
sizeof(struct struct_flags) = 1
flg.is_adult = 1
flg.is_male = 1
flg.is_sportsman = 0
flg.is_artist = 1
flg.no = 10
$

sizeofの結果は1(バイト)、つまり8ビットで済んでいる・・・。
でこのように値をセットでき、出力できてる・・・。

Sample/bit_field.c at master · bg1bgst333/Sample · GitHub