## 8.4 bitset の抽象化

bitset は set と vector の両方の機能の交差した部分を持っています。vector の抽象化の vector<bool> と同様に、この抽象化は 2 進 (0/1 ビット) 値のセットを表現します。ただし、set 演算はビット単位の論理演算子を使用して、bitset で実行することができます。クラス bitset は要素へアクセスする反復子を提供しません。

### 8.4.1 インクルードファイル

bitset ヘッダーファイルは、bitset データ型を使用するすべてのプログラムにインクルードする必要があります。

    #include <bitset>

### 8.4.2 bitset の宣言と初期化

bitset はテンプレートクラスの抽象化です。ただし、テンプレート引数は型ではなく整数値です。値は set が包含するビット数を表現します。

    bitset<126> bset_one;        // 126 ビットのセットを作成する

代替手法では、セットのサイズをコンストラクタへの引数として指定することを許可します。実際のサイズは、テンプレートの引数およびコンストラクタの引数として使用される値よりも小さくなります。この手法は、プログラムにサイズの異なる 2 つ以上のビットベクトルが含まれる場合に有用です。大きなサイズのテンプレート引数を一貫して使用することは、クラスのメソッドが 1 セットだけであることを意味します。しかし、実際のサイズはコンストラクタによって決まります。

    bitset<126> bset_two(100);   // このセットの要素は 100 だけ

コンストラクタの 3 番目の形式は、引数として文字 0 と 1 による文字列を使用します。文字列の文字数と同じ数の要素をもつ bitset が作成され、文字列からの値で初期化されます。

    bitset<126> small_set("10101010");   // このセットには 8 つの要素がある

### 8.4.3 要素へのアクセスとテスト

bitset の個別ビットには、添字演算を使用してアクセスすることができます。ビットを 1 とするかどうかは、メンバー関数 `test()` を使用して決定することができます。bitset のいずれかのビットが on であるかどうかは、メンバー関数 `any()` を使用してテストされ、ブール値が生じます。`any()` の逆は、メンバー関数 `none()` によって返されます。

    bset_one[3] = 1;
    if (bset_one.test(4))
       cout << "bit position 4 is set" << endl;
    if (bset_one.any())
       cout << "some bit position is set" << endl;
    if (bset_one.none()) cout << "no bit position is set" << endl;

関数 `set()` は、特定のビットを設定するために使用することができます。関数 `bset_one.set(I)` は `bset_one[I] = true` と等価です。引数なしで関数を呼び出すと、すべてのビットの位置が true に設定されます。関数 `reset()` も同様で、引数なしで呼び出された場合は、指定された位置またはすべての位置が false に設定されます。関数 `flip()` は、引数がない場合に、指定された位置またはすべての位置を反転します。また、関数 `flip()` は個別のビット参照へのメンバー関数として提供されます。

    bset_one.flip();   // セット全体を反転させる
    bset_one.flip(12);   // ビット 12 だけを反転させる
    bset_one[12].flip();   // ビット 12 を再び反転させる

メンバー関数 `size()` は bitset のサイズを返し、メンバー関数 `count()` は設定されるビットの数を算出します。

### 8.4.4 set 演算

bitset の set 演算はビット単位の演算子を使用して実装され、同じ演算子が整数の引数で動作する場合と類似しています。

bitset に適用されるブール否定演算子 `~` は、引数セットの要素の反転を含む新しい bitset を返します。

2 つの bitset の積集合は、論理積演算子 `&` を使用して形成されます。また、演算子の代入形式も使用することができます。代入形式では、ターゲットが 2 つの set の論理和になります。

    bset_three = bset_two & bset_four;
       bset_five &= bset_three;

2 つのセットの和集合は、論理和演算子 `|` を使用して、同様の方法で形成されます。排他的論理和 は、ビット単位の排他または演算子 `^` を使用して形成されます。

左シフト演算子 `<<` と右シフト演算子 `>>` を 整数の引数で使用すると、bitset を左または右へシフトすることができます。ビットが整数値 `n` だけ左にシフトされる場合、新しいビットの位置 `I` が前の `I-n` の値になります。0 は新しい位置にシフトされます。

### 8.4.5 変換

メンバー関数 `to_ulong()` は bitset を `unsigned long` に変換します。この表現に適合できる数以上の要素を含む bitset でこの演算を実行すると、エラーになります。

メンバー関数 `to_string()` は、bitset を string 型のオブジェクトに変換します。string には bitset と同数の文字を使用することができます。各 0 ビットは文字 `0` に対応し、各 1 ビットは文字 `1` によって表現されます。

Copyright (c) 1998, Rogue Wave Software, Inc.
このマニュアルに関する誤りのご指摘やご質問は、電子メールにてお送りください。
OEM リリース, 1998 年 6 月