ビットフィールド

C では、構造体のメンバにビットフィールドが使える。ビットフィールドというのは、バイト単位ではなくビット単位のデータで、1つあるいは複数のビットに名前をつけてアクセスすることができる。
例えば、真と偽しか取らないようなメンバでは1ビットあれば用が足りるので、そんなときにビットフィールドを使えばメモリの節約になる。
ビットフィールドの定義の一般的な形式は次のとおり。

型 名前: サイズ;

「型」には int か unsigned を指定する。「サイズ」はビットフィールドのビット数。「名前」と「サイズ」はコロンで区切る。
次の構造体は、在庫情報を格納するためにビットフィールドを使っている。

struct b_type {
    unsigned department: 3;    /* 担当部署(最大7部署) */
    unsigned instock: 1;       /* 1: 在庫あり 0: 在庫なし */
    unsigned backorderd : 1;   /* 1: 未納 0: 納品済み */
    unsigned lead_time: 3;     /* 発注から納品までの月数 */
} inv[MAX_ITEM];

この例では、構造体すべての情報を8ビット(1バイト)に詰め込んでいる。

ビットフィールドの参照方法は、普通の構造体メンバと変わらない。ドット演算子を使えばいい。

inv[9].department = 3;

ビットフィールドはの合計をバイト単位に合わせる必要はない。次にようなものでも構わない。

struct b_type {
    int a: 2;
    int b: 3;
};

同じ構造体の中に、普通のメンバとビットフィールドを混在させても構わない。次の例は最初の例に、品目名の文字列を追加している。

struct b_type {
    char name[40];             /* 品目名 */
    unsigned department: 3;    /* 担当部署(最大7部署) */
    unsigned instock: 1;       /* 1: 在庫あり 0: 在庫なし */
    unsigned backorderd : 1;   /* 1: 未納 0: 納品済み */
    unsigned lead_time: 3;     /* 発注から納品までの月数 */
} inv[MAX_ITEM];