ホームに戻る
出典 :
bitset | Programming Place Plus C++編【標準ライブラリ】 第13章
関連 :
コンテナ
目次 :

ビットセットとは

STLで規定されるコンテナの一つで、固定長のビット列。フラグとして用いることができる。

必要なヘッダ

#include <bitset>

宣言・初期化

初期値を与えた場合は 右詰め で配置される。初期値の桁数が変数に対して不足している場合は上位桁が0で埋められ、余剰となる場合は上位桁が切り捨てられる。

C++03以前

(符号なし)整数値、または string を用いて初期化が可能。文字列は '0' が false (0) に、'1' が true (1) に相当する。
画像

C++11以降

上記に加え、const char*(リテラル)を初期値に使用可能。また、false / true に割り当てる文字を指定できる。
(省略時は '0' と '1' となる。)
画像

破棄

bitset はヒープ(動的メモリ)を使用しないため、デストラクタは何も行わない。

要素の参照

特定のビットの状態は添字演算子([])、または test() で参照できる。 添字[0]はLSB(最下位ビット)である点に注意
#include <bitset> #include <iostream> void main() { std::bitset<8> bset(0xF0); //< 11110000 std::cout << bset[0] << std::endl; //< 0 std::cout << bset[4] << std::endl; //< 1 std::cout << bset.test(1) << std::endl; //< 0 std::cout << bset.test(5) << std::endl; //< 1 }
また、以下の関数を使用できる。

要素の更新

添字演算子([])、set() 、reset() を用いる。
また、flip() を用いることで指定ビット、または全ビットを反転できる。
#include <bitset> void main() { std::bitset<8> bset(0xF0); //< 0xF0 で初期化 ⇒ 11110000 bset[0] = true; //< 0ビット目を true に ⇒ 11110001 bset.set(3); //< 3ビット目を true に ⇒ 11111001 bset.set(7, false); //< 7ビット目を false に ⇒ 01111001 bset.set(); //< 全ビット を true に ⇒ 11111111 bset.reset(4); //< 4ビット目を false に ⇒ 11101111 bset.reset(); //< 全ビット を false に ⇒ 00000000 bset.flip(6); //< 6ビット目を 反転 ⇒ 01000000 bset.flip(); //< 全ビット を 反転 ⇒ 10111111 }

ビット演算

通常の符号なし整数と同様に、ビット演算を行うことができる。
#include <bitset> void main() { std::bitset<8> bset(0xF0); //< 11110000 bset &= 0xAA; //< ビット論理積(AND) ⇒ 10100000 bset |= 0x0F; //< ビット論理和(OR) ⇒ 10101111 bset ^= 0xFF; //< ビット排他論理和(XOR) ⇒ 01010000 bset = ~bset; //< 否定(NOT) ⇒ 10101111 bset <<= 4; //< 左シフト ⇒ 11110000 bset >>= 2; //< 右シフト ⇒ 00111100 }

入出力

bitset は標準入出力ストリームと直接連携できる。
#include <bitset> #include <iostream> void main() { std::bitset<10> bset; std::cin >> bset; //< コンソール入力を bset に反映 std::cout << bset << std::endl; //< bset の内容を出力 }
実行結果
1101 //< コンソールからの入力内容 0000001101

型変換

to_string() に関する注意

C++03以前

テンプレート実引数が必要である。
#include <bitset> void main() { std::bitset<10> bset(0xF0); std::string s = bset.to_string<char, std::char_traits<char>, std::allocator<char> >(); //< "0011110000" }

C++11以降

デフォルトのテンプレート実引数が与えられるため、テンプレート実引数の指定は不要。また、false / true に割り当てる文字を指定できる。(省略時は '0' と '1' 。)
#include <bitset> void main() { std::bitset<10> bset(0xF0); std::string s = bset.to_string('F', 'T'); //< "FFTTTTFFFF" std::string s = bset.to_string(); //< "0011110000" }