1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ビット演算でフラグ管理【C++】

Last updated at Posted at 2023-02-24

はじめに

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

さいごに

苦手意識があっても理解できるとそんなに難しくない!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?