【C++】std::bitsetで固定長のビットを格納し、ビットごとの操作を簡単に行う【標準ライブラリ】

【C++】std::bitsetで固定長のビットを格納し、ビットごとの操作を簡単に行う【標準ライブラリ】

std::bitsetとは

std::bitset はC++標準ライブラリに含まれるビット列を管理するためのクラスである。固定長のビットを格納し、ビットごとの操作を簡単に行うことができる。

基本的な使い方

std::bitset の基本的な使い方を紹介する。

#include <iostream>
#include <bitset>

int main() {
    std::bitset<8> b1;          // すべて0のビット列
    std::bitset<8> b2(0b1101);  // 整数を元に初期化
    std::bitset<8> b3("1010");  // 文字列を元に初期化
    
    std::cout << b1 << std::endl; // 00000000
    std::cout << b2 << std::endl; // 00001101
    std::cout << b3 << std::endl; // 00001010

    return 0;
}

ビット演算

std::bitset はビットごとの演算を簡潔に行うことができる。

#include <iostream>
#include <bitset>

int main() {
    std::bitset<8> a("1101");
    std::bitset<8> b("1011");

    std::cout << (a & b) << std::endl; // AND演算: 1001
    std::cout << (a | b) << std::endl; // OR演算: 1111
    std::cout << (a ^ b) << std::endl; // XOR演算: 0110
    std::cout << (~a) << std::endl;    // NOT演算: 11110010

    return 0;
}

文字列や数値との変換

std::bitset は数値や文字列と相互変換が可能。

#include <iostream>
#include <bitset>

int main() {
    std::bitset<8> b("1101");

    // 数値に変換
    std::cout << b.to_ulong() << std::endl;  // 13
    std::cout << b.to_ullong() << std::endl; // 13

    // 文字列に変換
    std::cout << b.to_string() << std::endl; // "00001101"

    return 0;
}

ビットの走査

ビットを個別に操作する例。

#include <iostream>
#include <bitset>

int main() {
    std::bitset<8> b("11010010");

    for (size_t i = 0; i < b.size(); ++i) {
        std::cout << "Bit " << i << ": " << b[i] << std::endl;
    }

    return 0;
}

典型的な使用例

フラグ管理

#include <iostream>
#include <bitset>

int main() {
    std::bitset<4> flags; 

    flags.set(1);
    flags.set(3);

    std::cout << "Flags: " << flags << std::endl; // 1010

    return 0;
}

部分集合の列挙

#include <iostream>
#include <bitset>

int main() {
    int n = 3;
    for (int i = 0; i < (1 << n); ++i) {
        std::bitset<3> subset(i);
        std::cout << subset << std::endl;
    }

    return 0;
}

ハミング重量の計算

#include <iostream>
#include <bitset>

int main() {
    std::bitset<8> b("11010110");

    std::cout << "Hamming Weight: " << b.count() << std::endl;

    return 0;
}

パフォーマンスと注意点

  • std::bitset は固定サイズのため、大規模なビット列には不向き。
  • 動的なビット列が必要なら std::vector<bool>boost::dynamic_bitset を検討。
  • ビットごとの操作は高速だが、数値変換はオーバーヘッドがある。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です