C++ ビットセットとその応用
ビットセットはブール値の配列ですが、各ブール値は別個のバイトに格納されるのではなく、ビットセットは次のようにスペースを最適化します。 各ブール値は 1 ビットのスペースのみを使用します 、 それで ビットセットが占めるスペースは、ブールの配列またはブールのベクトルのスペースより小さいです 。
ビットセットの制限は次のとおりです。 サイズはコンパイル時にわかっている必要があります。つまり、ビットセットのサイズは固定されています。
std::ビットセット 内部で定義されているビットセットのクラス テンプレートです。 ヘッダーファイル したがって、プログラムで bitset を使用する前にヘッダー ファイルをインクルードする必要があります。
構文:
bitset variable_name(initialization);
ビットセットは 3 つの方法で初期化できます。
1. 未初期化: すべてのビットはゼロに設定されます。
bitset variable_name;
2. 10 進整数による初期化: ビットセットは、指定された 10 進数を 2 進数形式で表します。
bitset variable_name(DECIMAL_NUMBER);
3. バイナリ文字列による初期化: Bitset は指定されたバイナリ文字列を表します。
bitset variable_name(string('BINARY_STRING')); bitset variable_name('BINARY_STRING'); 例:
C++ // C++ program to demonstrate the bitset #include #include using namespace std; int main() { // declaring an uninitialized bitset object bitset <8>未初期化ビットセット; // 10 進数のビットセットによる初期化 <8>10 進数ビットセット(15); // バイナリ文字列ビットセットによる初期化 <8>stringBitset(string('1111')); コート < < 'Uninitialized bitset: ' < < uninitializedBitset < < endl; cout < < 'Initialized with decimal: ' < < decimalBitset < < endl; cout < < 'Initialized with string: ' < < stringBitset < < endl; return 0; } 出力
Uninitialized bitset: 00000000 Initialized with decimal: 00001111 Initialized with string: 00001111
std::bitset メンバー関数
std::bitset クラスには、ビットセット オブジェクトを操作するための便利なメンバー関数がいくつか含まれています。以下は std::bitset のいくつかのメンバー関数のリストです。
| 関数名 | 機能の説明 |
|---|---|
| セット() | をセットする ビット値 指定されたインデックスで 1に 。 |
| リセット() | をセットする ビット値 指定されたインデックスで 0まで 。 |
| フリップ() | ビット値を反転します 指定されたインデックスで。 |
| カウント() | カウント の数 ビットを設定する 。 |
| テスト() | を返します ブール値 指定されたインデックスで 。 |
| どれでも() | かどうかを確認します どれでも ビットは セット 。 |
| なし() | かどうかを確認します なし ビットは セット。 |
| 全て() | どうかを確認してください 全て ビットは セット。 |
| サイズ() | を返します ビットセットのサイズ。 |
| to_string() | 改宗者 ビットセットを std::string に設定します。 |
| to_follow() | 改宗者 ビットセットを unsigned long に設定します。 |
| to_ullong() | 改宗者 ビットセットを unsigned long long に設定します。 |
例:
C++ // C++ program to demonstrate the // use of std::bitset member // functions #include #include using namespace std; int main() { // declaring index variable int index = 0; // declaring few bitset objects bitset <4>allSet('1111')、allUnset; コート < < 'any() value: ' < < boolalpha < < allSet.any() < < endl; cout < < 'all() value: ' < < allSet.all() < < endl; cout < < 'none() value: ' < < allSet.none() < < endl; cout < < 'test() at index 0: ' < < noboolalpha < < allSet.test(index) < < endl; cout < < 'size() value: ' < < allSet.size() < < endl; cout < < 'Value of allUnset on before using set(): ' < < allUnset < < endl; allUnset.set(index); cout < < 'Value of allUnset on after using set(): ' < < allUnset < < endl; cout < < 'Value of allSet on before using reset(): ' < < allSet < < endl; allSet.reset(index); cout < < 'Value of allSet on after using reset(): ' < < allSet < < endl; // declaring an empty string string bitString; // using to_string() method to assign value to empty // string bitString = allSet.to_string(); cout < < 'bitString: ' < < bitString < < endl; cout < < 'Unsigned Long value: ' < < allSet.to_ulong(); return 0; } 出力
any() value: true all() value: true none() value: false test() at index 0: 1 size() value: 4 Value of allUnset on before using set(): 0000 Value of allUnset on after using set(): 0001 Value of allSet on before using reset(): 1111 Value of allSet on after using reset(): 1110 bitString: 1110 Unsigned Long value: 14
注記: boolalpha は、ブール値の場合は 1 または 0、その逆の場合は noboolalpha の代わりに、true と false を出力するために使用されます。
std::bitset 演算子
基本的な演算子の一部は、ビットセット オブジェクトを操作するためにオーバーロードされています。これらの演算子のリストは次のとおりです。
| オペレーター | 手術 |
|---|---|
| [] | アクセス オペレーター |
| & | ビットごと そして |
| | | ビットごと または |
| ! | ビットごと 無料 |
| >>= | バイナリ 右シフト そして割り当てます |
| < <= | バイナリ 左方移動 そして割り当てます |
| &= | ビット単位の値を代入します そして 最初のビットセットに。 |
| |= | ビット単位の値を代入します または 最初のビットセットに。 |
| ^= | ビット単位の値を代入します 無料 最初のビットセットに。 |
| ~ | ビットごと ない |
例:
C++ // C++ program to show the different operator functions on // bitset #include #include using namespace std; int main() = bitset2) < < endl; // bitwise NOT cout < < 'Bitwise NOT: ' < < (result = ~bitset1) < < endl; // bitwise XOR bitset1 = 9; cout < < 'Bitwise XOR: ' < < (bitset1 ^= bitset2) < < endl; bitset1 = 9; cout < < 'Binary leftshift on bitwise1: ' < < (bitset1 < <= 1) < < endl; bitset1 = 9; cout < < 'Binary rightshift on bitwise1: ' < < (bitset1>>= 1) < < endl; return 0;
出力
Bitset1: 1001 Bitset2: 1010 Accessing bit value at index 1 of bitset1: 0 Bitwise AND using &: 1000 Bitwise AND using &=: 1000 Bitwise OR using |: 1011 Bitwise OR using |=: 1011 Bitwise NOT: 0100 Bitwise XOR: 0011 Binary leftshift on bitwise1: 0010 Binary rightshift on bitwise1: 0100
std::bitset と std::vector および bool の配列の違い
ブール値のベクトルとブール値の配列を実装して、ビットセットのようなブール値のシーケンスを格納することもできますが、各実装にはいくつかの違いがあります。
| パラメータ | ビットセット | ブールのベクトル | ブール値の配列 |
|---|---|---|---|
| 意味 | 各ビットがメモリの 1 ビットを占有するように格納されたビットのシーケンスで構成されるクラス テンプレート。 | C++ STL のベクトルのバリエーション。各要素のサイズは 1 ビットで、型は bool です。 | ブール データ要素の固定サイズの連続コレクション。 |
| サイズ | 固定サイズ。 | ダイナミックサイズ。 | 固定サイズ。 |
| メモリ | 単一の要素はメモリの 1 ビットを占有します。 | 単一の要素はメモリの 1 ビットを占有します。 | 1 つの要素は 1 バイトのメモリを占有します。 |
| スピード | 同じ | 同じ | もっと早く |