C++でアセンブラを触る際非常に高速軽量化に必要なビット操作、
それ利用した、ビット操作によるフラグの扱いを下記にメモします。
変数の各ビットを、フラグとして使用する。
char cflag = 0; → 0000_0000 → フラグ8つ
8ビット ビット(2進数の表記)
で8ケタ。0か1か、
が8つ扱える。
サンプル
0 0 0 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); //cflagを2進数にしてMojiに代入
printf(“cflag = %sn”,Moji); //cflagを2進数にした値を表示
//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)なら、無敵じゃない
}
}
Cool!