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;
}