プログラマーの卵の日記

備忘録になってます!小難しそうなことから超簡単なことまでやってます!!

【C++】フラッグのオンオフに対してboolを使わないだと

boolを使わない

 

 これについて、これまでに読んだ本で何度も見かけました。

ですが、ほとんどの本が「boolではなくunsigned intやunsigned charなどを使います!」というだけで、実際の使い方を言及しているというものはありませんでした。

 ということで、気になって仕方なかったので色々調べて見つけ出しました。

 

 カギとなるのは2進数でした。

unsigned charの範囲は0~255です。これを2進数で言えば、

00000000~11111111の8桁です。

これの見方を変えれば、boolの変数が8つくっついているもの。という解釈で考えられたらしいです。

 

 

コード


#include <iostream>

unsigned char test = 200; // 11001000

enum class ECheck10
{
	One = 1,
	Two = 2,
	Three = 4,
	Four = 8,
	Five = 16,
	Six = 32,
	Seven = 64,
	Eight = 128, 
};

enum class ECheck2To10
{
	One = (1 << 0),
	Two = (1 << 1),
	Three = (1 << 2),
	Four = (1 << 3),
	Five = (1 << 4),
	Six = (1 << 5),
	Seven = (1 << 6),
	Eight = (1 << 7),
};

enum class ECheck2
{
	One = 0,
	Two = 1,
	Three = 2,
	Four = 3,
	Five = 4,
	Six = 5,
	Seven = 6,
	Eight = 7,
};

bool CheckA(unsigned char t_flag)
{
	unsigned char check = test;

	check /= t_flag;

	check *= static_cast<unsigned char>(ECheck10::Eight);

	return check;
}

bool CheckB(unsigned char t_flag)
{
	unsigned char check = test;

	check >>= t_flag;

	check <<= static_cast<unsigned char>(ECheck2::Eight);

	return check;
}

void ChangeOn(unsigned char t_flag)
{
	test |= t_flag;
}

void ChangeOff(unsigned char t_flag)
{
	test &= ~t_flag;
}


int main()
{
	std::cout << (static_cast<int>(test)) << std::endl;

	std::cout << CheckA(static_cast<unsigned char>(ECheck10::Four)) << std::endl;
	std::cout << CheckB(static_cast<unsigned char>(ECheck2::Four)) << std::endl;


	ChangeOn(static_cast<unsigned char>(ECheck2To10::Four));
	std::cout << (static_cast<int>(test)) << std::endl;
	for (ECheck2To10 i : { ECheck2To10::Eight, ECheck2To10::Seven, ECheck2To10::Six, ECheck2To10::Five, ECheck2To10::Four, ECheck2To10::Three, ECheck2To10::Two, ECheck2To10::One})
	{
		std::cout << CheckA(static_cast<unsigned char>(i));
	}
	std::cout << std::endl;
	ChangeOff(static_cast<unsigned char>(ECheck2To10::Four));
	std::cout << (static_cast<int>(test)) << std::endl;
	for (ECheck2To10 i : { ECheck2To10::Eight, ECheck2To10::Seven, ECheck2To10::Six, ECheck2To10::Five, ECheck2To10::Four, ECheck2To10::Three, ECheck2To10::Two, ECheck2To10::One})
	{
		std::cout << CheckA(static_cast<unsigned char>(i));
	}
	std::cout << std::endl;

	return 0;
}