C言語では通常char型などbyte単位で処理を行うがフラグやネットワークプログラムの際はbit単位の処理が
必要になる。そのときにビットフィールドを利用する。
#include
/*
* この例では4Bytesの構造体を用意している.
*/
struct st_large_data {
unsigned char critical_error;
unsigned char parity_erroa;
unsigned char channel_down_error;
unsigned char connection_error;
};
int main(int argc, char *argv[]) {
struct st_large_data test_data;
/*
* criticalエラーフラグとchannel_downフラグをオンにする。
*/
test_data.critical_error = 1;
test_data.channel_down_error = 1;
return 0;
}
上記ではただ単にオン/オフのフラグだけなのに4byteを利用している。ネットワークプログラミングでは
同然データをネットワーク上に出力させるので極力データ量を少なくさせなければならない。そこで
以下のようにビットフィールドを利用したプログラムを記述する。
#include
/*
* この例では1byteの構造体を用意している.
*/
struct st_large_data {
unsigned int critical_error : 1;
unsigned int parity_error : 1;
unsigned int channel_down_error : 1;
unsigned int connection_error : 1;
};
int main(int argc, char *argv[]) {
struct st_large_data test_data;
/*
* criticalエラーフラグとchannel_downフラグをオンにする。
*/
test_data.critical_error = 1;
test_data.channel_down_error = 1;
printf("%d", test_data.critical_error);
return 0;
}
ISO C89ではunsigned charは警告が出る。unsigned intでのビットフィールドでは警告が出なかった。
ビットフィールドはunsigned intで定義するものなのか?そんなことないと思うが要調査。