Bit計算(C++)


On this page

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同士を計算する場合につかう演算子を載せる。

  • ~ : 各bitのnotを取る (例: ~0b011なら0b100のこと)。
  • & : 各bitのandを取る (例: 0b011&0b101なら0b001のこと)。
  • | : 各bitのorを取る (例: 0b011|0b101なら0b111のこと)。
  • ^ : 各bitのxorを取る (例: 0b011^0b101なら0b110のこと)。
  • << : 各bitを右の数字の分だけ左にずらす (例: 0b011<<2なら0b01100のこと)。
  • >> : 各bitを右の数字の分だけ左にずらす (例: 0b01100>>2なら0b011のこと)。
  • &= : 各bitのandを取って代入 (例: testbit1(0b110が入っている)&=0b101でtestbit1は0b100)
  • |= : 各bitのorを取って代入 (例: testbit1(0b110が入っている)|=0b101でtestbit1は0b111)

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