ホームに戻る
出典 :
関連 :
目次 :
ビットセットとは
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
}
また、以下の関数を使用できる。
- size() : ビット幅(桁数)を取得
- count() : true となっているビットの総数を取得
- any() : いずれかのビットが true となっていれば true 、そうでなければ(全ビット false ならば) false
( count() > 0 )
- none() : いずれのビットも true となっていなければ true 、そうでなければ(いずれかが true ならば) false
( count() == 0 )
- all() (C++11以降) : すべてのビットが true となっていれば true 、そうでなければ(いずれかが false ならば) false
( count() == size() )
要素の更新
添字演算子([])、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() : 文字列(string)に変換
- to_ulong() : unsigned longに変換
- to_ullong() (C++11以降) : unsigned long longに変換
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"
}