<<戻る

ビットフィールド

ビットフィールドとは?

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で定義するものなのか?そんなことないと思うが要調査。