C++ ビット操作によるフラグの扱いメモ

C++でアセンブラを触る際非常に高速軽量化に必要なビット操作、
それ利用した、ビット操作によるフラグの扱いを下記にメモします。

 

変数の各ビットを、フラグとして使用する。

 char cflag = 0; → 0000_0000 → フラグ8つ

8ビット       ビット(2進数の表記)

           で8ケタ。0か1か、

           が8つ扱える。

 

サンプル

 

 0 0 0 0_0   

     未使用    ③ ② ①

 

生死を扱う ②性別を扱う ③無敵かどうか

 

0ビット目・・・1なら生、0なら死

 1ビット目・・・0なら男、1なら女

 2ビット目・・・0なら通常、1なら無敵

                                       

        1にする  0にする  調べる          

0ビット目    |1     &(~1)  &1が0でなければ  

(生死)                             

1ビット目   |(1<<1) &(~(1<<1)) &(1<<1)が、0でなければ

(性別)                             

2ビット目   |(1<<2) &(~(1<<2)) &(1<<2)が、0でなければ

(無敵)                             

 

//———–インクルード————————–

#include <stdio.h> //基本的な入出力のヘッダファイル

#include <stdlib.h> //itoa()などに必要なヘッダファイル

 

//――――――メイン関数―――――――――――――――――――――――――――――――――――――――――

void main()

{

char cflag = 0; // (2進数では 0000_0000)

 

//―――――0ビット目を調べる――――――――――――――――――――――――――――

if(cflag & 1) //cflagの0ビット目(生死)だけを調べる。

{

printf(“0ビット目は1。生きているn”); //0ビット目が0でない(1)なら、生存

}else

{

printf(“0ビット目は0.死んでいるn”); //1ビット目が1でない(0)なら、死んでいる

}

 

cflag = cflag | 1; //0ビット目を1にする

printf(“0ビット目を1にする。死んでいた場合、生きかえるn”);

 

//生きているか死んでいるかもう一度表示

if(cflag & 1) //cflagの0ビット目(生死)だけを調べる。

{

printf(“0ビット目は1。生きているn”); //0ビット目が0でない(1)なら、生存

}else

{

printf(“0ビット目は0.死んでいるn”); //1ビット目が1でない(0)なら、死んでいる

}

 

cflag = cflag & (~1); //0ビット目を0にする。

printf(“0ビット目を0にする。生きていた場合、死亡するn”);

 

if(cflag & 1) //cflagの0ビット目(生死)だけを調べる。

{

printf(“0ビット目は1。生きているn”); //0ビット目が0でない(1)なら、生存

}else

{

printf(“0ビット目は0.死んでいるn”); //1ビット目が1でない(0)なら、死んでいる

}

}

 

練習問題

 

1、性別や、無敵かどうか、なども、サンプルと同じように確認せよ。

 

//———–インクルード————————–

#include <stdio.h> //基本的な入出力のヘッダファイル

#include <stdlib.h> //itoa()などに必要なヘッダファイル

//――――――メイン関数―――――――――――――――――――――――――――――――――――――――――

void main()

{

char cflag = 127; // (2進数では 0000_0000)

char Moji[33]; //文字列を扱うchar型配列を宣言

itoa(cflag,Moji,2); //cflag2進数にしてMojiに代入

printf(“cflag = %sn”,Moji); //cflag2進数にした値を表示

 

//cflagの0ビット目を調べる

if(cflag & 1) //cflagの0ビット目(生死)だけを調べる。

{

printf(“0ビット目は1。生きているn”); //0ビット目が0でない(1)なら、生存

}else

{

printf(“0ビット目は0.死んでいるn”); //0ビット目が1でない(0)なら、死んでいる

}

 

//cflagの1ビット目を調べる

if(cflag & (1<<1)) //cflagの1ビット目(性別)だけを調べる

{

printf(“1ビット目は1。男n”); //1ビット目は0でない(1)なら、男

}else

{

printf(“1ビット目は0.女n”); //1ビット目は1でない(0)なら、女

}

 

//cflagの2ビット目を調べる

if(cflag & (1<<2)) //cflagの2ビット目(無敵かどうか)だけを調べる

{

printf(“2ビット目は1。無敵n”); //2ビット目は0でない(1)なら、無敵

}else

{

printf(“2ビット目は0。無敵じゃないn”); //2ビット目は1でない(0)なら、無敵じゃない

}

}