多くのフラグ(ある条件を満たしているかどうか)を処理する上で便利な方法がBit演算である。 そういったときにBit計算ができると、そういったたくさんのフラグ処理しやすくなる。 ここではC/C++でのBit演算について説明する。
Bitとはデータの単位で、8 bit = 1 byteのこと。 2進数の1桁、つまりONかOFFか、1か0かと言うのが1 bitになっている。 C++でbitを扱う場合は整数として扱われ、int型だと32 bitつまり32個のON/OFF、1/0を詰めて置くことができる。 int型に2進数を詰める場合は0bの後に110とか1111とかつけることで2進数として変数に入る。
int testbit1 = 0b110
int testbit2 = 0b1111
しかし詰めたbitをcout等で見ようとすると、bitを2進数から10進数に変換した整数値が表示されてしまう。
std::cout<<testbit1<<std::endl
std::cout<<testbit2<<std::endl
実行結果:
6
15
そこでC++11で使えるbitsetという関数を使えば元の2進数を表示できる。
#include <bitset>
(中略)
std::cout<<std::bitset<8>(testbit1)<<std::endl
std::cout<<std::bitset<8>(testbit2)<<std::endl
実行結果:
00000110
00001111
ここでbitset<8>の8は2進数を8桁表示するという意味である。
Bit同士を計算する場合につかう演算子を載せる。
演算子の使い方の例1:
例えば3つのON/OFFのスイッチ(sw1,sw2,sw3)があって、sw1,sw3のどっちかがONならOKという場合、 現在の状態がstatusという変数に一の位から順にsw1, sw2, sw3というようにON/OFFが入っているとすると。
int status=<現在の状態>
if(status & 0b101){
<OKのときの処理>
}
このときもし現在の状態がsw1だけONの場合は0b001 & 0b101 = 0b001でifのカッコ内は真、
現在の状態がsw3だけONの場合は0b100 & 0b101 = 0b100でifのカッコ内は真、
両方ともONなら0b101 & 0b101 = 0b101でifのカッコ内は真、
両方ともOFFで0b000 & 0b101 = 0b000でifのカッコ内は偽なので想定している通りの動作になる。
演算子の使い方の例2:
さっきの3つのON/OFFのスイッチ(sw1,sw2,sw3)の、sw1,sw3のどちらもONならOKという場合、 現在の状態がstatusという変数に一の位から順にsw1, sw2, sw3というようにON/OFFが入っているとすると。
int status=<現在の状態>
if((status & 0b101)==0b101){
<OKのときの処理>
}
このときもし現在の状態がsw1だけONの場合は(0b001 & 0b101) = 0b001で0b101と異なるのでifのカッコ内は偽、
現在の状態がsw3だけONの場合は0b100 & 0b101 = 0b100で0b101と異なるのでifのカッコ内は偽、
両方ともONなら0b101 & 0b101 = 0b101で0b101と等しくなるのでifのカッコ内は真、
両方ともOFFで0b000 & 0b101 = 0b000で0b101と異なるのでifのカッコ内は偽となり、想定している通りの動作になる。