最終更新日時: 2018年11月15日 11時19分22秒 (JST)
Akira Takahashi が更新

履歴 編集

class template
<bitset>

# std::bitset

    namespace std {
      template <size_t N>
      class bitset;
    }

## 概要

`<bitset>`ヘッダでは、ビットの固定サイズ配列を計算するための`std::bitset`クラスを定義する。

`std::bitset`は、`N`ビットのビット集合を表すクラスである。添字演算子で任意の位置のビット状態を確認でき、文字列と整数値との相互変換が可能であることを特徴とする。

テンプレートパラメータは、以下を意味する：

- `N` : ビット集合のビット数

### メンバ関数

### 構築・破棄

名前 | 説明 | 対応バージョン
--- | --- | ---
`(constructor)` | コンストラクタ |
`~bitset() = default` | デストラクタ |
`bitset& operator=(const bitset&) = default` | 代入演算子 |

### 集合演算

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator&=` | 論理積の複合演算 |
`operator|=` | 論理和の複合演算 |
`operator^=` | 排他的論理和の複合演算 |
`operator<<=` | 左シフトの複合演算 |
`operator>>=` | 右シフトの複合演算 |
`set` | 任意の位置のビットを設定する |
`reset` | 任意の位置のビットを0にする |
`operator~` | ビットを反転させる |
`flip` | ビットを反転させる |

### 要素アクセス

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator[]` | 任意の位置のビットにアクセスする |
`count` | 1になっているビットの数を取得する |
`size` | ビット数を取得する |
`test` | 任意の位置のビットが1になっているかを判定する |
`all` | 全てのビットが1になっているかを判定する | C++11
`any` | いずれかのビットが1になっているかを判定する |
`none` | 全てのビットが0になっているかを判定する |
`to_ulong` | `unsigned long`型に変換する |
`to_ullong` | `unsigned long long`型に変換する | C++11
`to_string` | 文字列に変換する |
`operator==` | 等値比較 |
`operator!=` | 非等値比較 |
`operator<<` | 左シフト |
`operator>>` | 右シフト |

## メンバ型

名前 | 説明 | 対応バージョン
--- | --- | ---
`reference` | 任意の位置のビットを参照するためのプロキシ型 |

## 非メンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator&` | 論理積 |
`operator|` | 論理和 |
`operator^` | 排他的論理和 |
`operator>>` | ストリームから入力 |
`operator<<` | ストリームに出力 |

## ハッシュサポート

名前 | 説明 | 対応バージョン
--- | --- | ---
`template <class T> struct hash;` | `hash`クラスの先行宣言 | C++11
`template <size_t N> struct hash<bitset<N>>;` | `hash`クラスの`bitset`に対する特殊化 | C++11

## 例

    #include <iostream>
    #include <bitset>

    int main()
    {
      // 整数から8ビットのビット集合を構築
      std::bitset<8> bs1(131uL); // 10000011

      // 文字列から8ビットのビット集合を構築
      std::bitset<8> bs2("10000011");

      // 1ビット目が1かを判定
      if (bs1[1]) {
        std::cout << "1st bit is 1" << std::endl;
      }

      // 2ビット目を1にする
      bs1.set(2);
      std::cout << "2nd bit to 1 : " << bs1 << std::endl;

      // 2ビット目を0に戻す
      bs1.reset(2);

      // いずれかのビットが1かを判定
      if (bs1.any()) {
        std::cout << "some bits are 1" << std::endl;
      }

      // 論理演算
      std::bitset<8> and_bits = bs1 & std::bitset<8>("10000001"); // 論理積
      std::bitset<8> or_bits  = bs1 | std::bitset<8>("00010100"); // 論理和
      std::bitset<8> xor_bits = bs1 ^ std::bitset<8>("00100011"); // 排他的論理和

      std::cout << "and : " << and_bits << std::endl;
      std::cout << "or  : " << or_bits << std::endl;
      std::cout << "xor : " << xor_bits << std::endl;
    }

### 出力

    1st bit is 1
    2nd bit to 1 : 10000111
    some bits are 1
    and : 10000001
    or  : 10010111
    xor : 10100000

### 参照

- N0075 Proposal for a Bitset Class
- N0220R2 A Proposal for Two Bitset Classes