<STEP1>

普段、数字をint型で扱っていますね。

int型は、今回の環境では32ビット(=4バイト)ありますので、2^32通り=(約40億通り)の数を表すことができます。

しかし、そんなに大きな値を使ってきましたか…?

 

例えば、日付を格納するための変数「day」を宣言する場合、

日付は1日〜31日までの31種類で表せますので、

31< 2^5(32) ですから、5ビットあれば表すことができます。

つまり、先頭の27ビットを無駄に消費しています。

この消費量を減らすための工夫が、ビットフィールドです。

 

ビットフィールドは、構造体や共用体の中で宣言します。

日付を格納する「day」には負の数を代入する必要はありませんので、明示的にunsigned intで宣言し、

unsigned int day;  //通常このように定義

unsigned int day :5 ;  //5ビットでオッケーなので、「:5(コロン5)」をつけて宣言

 

このように宣言します。

 

【演習1】

以下の変数を宣言する場合、何ビットあればよいでしょうか。

①月を格納する変数「month」

②ユーザの生まれ年を格納する変数「b_year」

③今年までの西暦を格納する変数「year」※BC(Before Crist)は含まない

④時を格納する変数「hour」

⑤分を格納する変数「minute」

⑥性別を格納する変数「gender」

 

【演習2】

演習1の①〜⑥までの変数を、実際に構造体の中に宣言してください。構造体名は、b_field_onです。

ビットフィールドを設定していない構造体b_field_offも宣言し、構造体のバイト数を比較しなさい。