ビット操作のソースコード

#include <iostream>
#include <bitset>
 
using namespace std;
 
bool isPoisen = false;
bool isStone = false;
bool isParalysis = false;
bool isDead = false;
 
unsigned char status = 0;
//00000000 8bitのフラグを用意、右4ビットで死麻石毒
const unsigned char poison = 1 << 0;//毒
//1を左に0ビットシフト 0001 => 0001
const unsigned char stone = 1 << 1;//石化
//1を左に1ビットシフト  0001 => 0010
const unsigned char paralysis = 1 << 2;//麻痺
//1を左に2ビットシフト  0001 => 0100
const unsigned char dead = 1 << 3;//死
//1を左に3ビットシフト  0001 => 1000
 
void bitkusaiIki() { //ff的な臭い息 ビットフラグ版
	int stat = rand() % 6;
	switch (stat) {
		//フラグをセットするときは、ORを使う
	case 0:status = status | poison; break;
	case 1:status = status | stone; break;
	case 2:status = status | paralysis; break;
	case 3:status = status | dead; break;
	case 4:status = status | poison | paralysis; break;  //毒と、麻痺が同時に起こる
	case 5:status = status | poison | paralysis | stone; break; //毒と麻痺と石化が同時に起こる
	default:break;
	}
}
 
 
 
void setState(const unsigned char sstate)
{
	status = status | sstate; //フラグを立てるときは OR
}
 
bool getState(const unsigned char sstate)
{
	return(status & sstate); //フラグを確認するときは AND
}
 
void unsetState(const unsigned char sstate)
{
	status = status & ~sstate; //フラグを下げるときは AND NOT
}
 
void kusaiIki() { //ff的な臭い息 フラグ変数版
	int stat = rand() % 4;
	switch (stat) {
	case 0:isPoisen = true; break;
	case 1:isStone = true; break;
	case 2:isParalysis = true; break;
	case 3:isDead = true; break;
	default:break;
	}
}
 
void lastChance()
{
	int stat = rand() % 100;
	if (stat == 7)
	{
		unsetState(dead);
	}
}
 
void printState()
{
	cout << "あなたの状態" << endl;
	cout << " 毒:" << getState(poison) << endl;
	cout << "石化:" << getState(stone) << endl;
	cout << "麻痺:" << getState(paralysis) << endl;
	cout << "  死:" << getState(dead) << endl;
}
 
int main() {
	//cout << "status=" << bitset<8>(status) << endl;
	//cout << "poison=" << bitset<8>(poison) << endl;
	//cout << "stone=" << bitset<8>(stone) << endl;
	//cout << "paralysis=" << bitset<8>(paralysis) << endl;
	//cout << "dead=" << bitset<8>(dead) << endl;
	//status = status | poison | stone;
	// 00000000
	// 00000001
	// 00000010 のOR
	//cout << "status=" << bitset<8>(status) << endl;
	//status = status & ~(stone) & ~(poison);
	////フラグを下げるときは & ~(下げるフラグ)
	//cout << "status=" << bitset<8>(status) << endl;
 
 
	srand((unsigned int)time(nullptr));
 
	while (!getState(dead)) {
		bitkusaiIki();
		printState();
		getchar();
	}
 
	cout << "ラストチャンス" << endl;
	lastChance();
	if (!getState(dead)) {
		cout << "生き返った!" << endl;
		printState();
	}
	else {
		cout << "ゲームオーバー" << endl;
	}
}