Bit計算(C++)

多くのフラグ(ある条件を満たしているかどうか)を処理する上で便利な方法がBit演算である。 そういったときにBit計算ができると、そういったたくさんのフラグ処理しやすくなる。 ここではC/C++でのBit演算について説明する。




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のカッコ内は偽となり、想定している通りの動作になる。