thisdesuのブログ

C言語はじめました

にほんブログ村 IT技術ブログ C/C++へ

マスク計算

真偽だけのフラグを良く使うことがありますが、さらに種類を設けて1つの値で表現する時などに使います。
例えば、ログ出力用に値を設けて、更に、デバック用・警告用・エラー用・通知用など、場合によって指定したものだけ出したい時に、1つの値で表現できたら便利でしょう。別々にフラグを作るのも大変だし指定するのも至難の業です。

例:値debugに、intの各ビットをフラグとして利用し、各値を1つの値で指定する。
1bit目:デバック用
2bit目:警告用
3bit目:エラー用
4bit目:通知用
指定は各ビットのフラグを設定後の値を指定(分かりやすいので10進で指定しています)

#include <stdio.h>

void testlog(unsigned int flg) {

    printf("flg(%d) =>",flg);
    if ( flg & 0x01 ) { printf("DEBUG,");    }
    if ( flg & 0x02 ) { printf("WARN,");    }
    if ( flg & 0x04 ) { printf("SYSTEM,");    }
    if ( flg & 0x08 ) { printf("INFO,");    }
    printf("\n");
}
int main() {
    unsigned int debug = 0;

    for(debug=0; debug<16; debug++) {
        testlog(debug);
    }
}


$ gcc main.c
$ ./a.out
flg(0) =>
flg(1) =>DEBUG,
flg(2) =>WARN,
flg(3) =>DEBUG,WARN,
flg(4) =>SYSTEM,
flg(5) =>DEBUG,SYSTEM,
flg(6) =>WARN,SYSTEM,
flg(7) =>DEBUG,WARN,SYSTEM,
flg(8) =>INFO,
flg(9) =>DEBUG,INFO,
flg(10) =>WARN,INFO,
flg(11) =>DEBUG,WARN,INFO,
flg(12) =>SYSTEM,INFO,
flg(13) =>DEBUG,SYSTEM,INFO,
flg(14) =>WARN,SYSTEM,INFO,
flg(15) =>DEBUG,WARN,SYSTEM,INFO,