はじめに
C++でビット演算。
すぐ忘れそうなので、メモ。
やりたいこと
ビットをON/OFFに見立てて管理したい。
OFF(0)、ON(1)としてビットを立てたり削除したりしたい。
使うもの
std::bitset
C++で数値をバイナリ形式に変換するための標準的なソリューション。
bitsetを使うと2進数⇔10進数の変換ができるし、なによりコードが見やすくなる。
10進数を2進数に変換
bitset<N>(A)
Nはビット数を指定する。
8ビット(00001111等)で管理したい場合は8を指定する。
2進数を10進数に変換
to_ulong()を使い、unsigned long型の整数に変換する。
bitset<N>(A).to_ulong()
ビットを使ったフラグ管理
0番目のフラグが立っている状態は (1<<0)
と表せる。
0番目と2番目と4番目のフラグが立っている状態は (1<<0) | (1<<2) | (1<<4)
となる。
これを用いてフラグ管理をしていく。
ビット bit に i 番目のフラグを立てる
bit|= (1<<i);
ビット bit に i 番目のフラグを消す
bit &= ~(1<<i);
ビット bit に i 番目のフラグが立っているかどうか
if (bit & (1<<i)){
return true;
}
ビット bit に i 番目のフラグが消えているかどうか
if (!(bit & (1<<i))){
return false;
}
実際のコード
main.cpp
#include <bitset>
#include <iostream>
using namespace std;
// 定数として宣言しておく
const uint32_t BIT_FLAG_0 (1<<0); // 0000 0001
const uint32_t BIT_FLAG_2 (1<<2); // 0000 0100
const uint32_t BIT_FLAG_4 (1<<4); // 0001 0000
int main()
{
int32_t bit_flg = 0;
// 0,2,4にフラグが立ったビット
bit_flg = BIT_FLAG_0 | BIT_FLAG_2 | BIT_FLAG_4;
cout << "bit_flg 0,2,4:" << bitset<8>(bit_flg) << endl;
// 2番目にフラグが立っているか確認
if (bit_flg & BIT_FLAG_2) {
cout << "the 2nd flag is up:" << bitset<8>(bit_flg) << endl;
}
// 2番目のフラグを消す
bit_flg &= ~BIT_FLAG_2;
cout << "bit_flg 0,4:" << bitset<8>(bit_flg) << endl;
// 2番目にフラグが消えているか確認
if (!(bit_flg & BIT_FLAG_2)) {
cout << "the 2nd flag is gone:" << bitset<8>(bit_flg) << endl;
}
return 0;
}
実行結果
bit_flg 0,2,4:00010101
the 2nd flag is up:00010101
bit_flg 0,4:00010001
the 2nd flag is gone:00010001
さいごに
苦手意識があっても理解できるとそんなに難しくない!