【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
を検討。 - ビットごとの操作は高速だが、数値変換はオーバーヘッドがある。