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ビットで済んでいる・・・。
でこのように値をセットでき、出力できてる・・・。