/* ====================================================================== */ /** * フラグのチェックプログラム * ビット演算やシフト演算を使ったフラグ操作する * 1ビットにつき1フラグを管理することができるので * 32ビット持っているint型を使用すると32個のflgを管理できる * ちなみに初期化する場合は0で初期化すること(特別な場合を除く) * 2012/08/29 ver1.0 基本形 */ /* ====================================================================== */ #include
using namespace std; //< フラグチェック関数(true=フラグが立っている) bool chack (unsigned char f); //< フラグをオンにする void flgON (unsigned char f); //< フラグをオフにする void flgOFF (unsigned char f); //< 全フラグ管理変数(0代入で全てのフラグをOFF) unsigned char flg=0; //< フラグ enum Flag{ A = (1 << 0), //< フラグその1(0x0001)=1 B = (1 << 1), //< フラグその2(0x0010)=2 C = (1 << 2), //< フラグその3(0x0100)=4 }; void main(){ int a=0; //< 選択肢 bool f=false; //< true=while文を抜ける while(true){ printf("\n現在のフラグ状況\n"); printf("%d %d %d\n",chack(A),chack(B),chack(C)); printf("0=A_ON ,1=B_ON ,2=C_ON\n"); printf("3=A_OFF ,4=B_OFF ,5=C_OFF\n"); printf("6=ALL_ON,7=ALL_OFF,8=break\n"); printf("->"); //< 選択肢 cin>>a; switch(a){ case 0:flgON(A); break; //< AのフラグをONにする case 1:flgON(B); break; //< BのフラグをONにする case 2:flgON(C); break; //< CのフラグをONにする case 3:flgOFF(A); break; //< AのフラグをOFFにする case 4:flgOFF(B); break; //< BのフラグをOFFにする case 5:flgOFF(C); break; //< CのフラグをOFFにする case 6:flgON(A | B | C); break; //< 全フラグをONにする case 7:flgOFF(A | B | C); break; //< 全フラグをOFFにする default:f=true; break; //< while文を抜ける } //< 0〜5以外の入力でbreak if(f)break; } } //< フラグのチェック関数 bool chack(unsigned char f){ //< 例:A=ON B=OFF C=ON f=C //< &は論理積、3ビット目だけを掛け算する //< 0x0101 & 0x0100 -> 0x0100 return ( ( flg & f) != 0); } //< フラグON関数 void flgON(unsigned char f){ //< 例:A=ON B=OFF C=OFF f=B //< |は論理和、2ビット目だけを足し算する //< 0x0001 |= 0x0010 -> 0x0011 flg |= f; } //< フラグOFF関数 void flgOFF(unsigned char f){ //< 例:A=ON B=OFF C=ON f=A //< ~は否定(反転)、1ビット目を掛け算する //< A = ~0x0001 -> 0x1110 //< 0x0101 &= 0x1110 -> 0x0100 flg &= ~f; }