【C/C++】 bitset (STL)
STLのコンテナではないけど、C++標準に含まれてるテンプレートクラスでbitsetというのがあります。これは中々面白い。要はビット単位でデータを保持するクラスなんやけど、何につかうか?と言うと、例えば
- コマンドオプションのフラグ情報保持
- メモリマネージャのセグメント管理
- データキャッシュのフラグ管理
ちょっと変わった所では
- 可変長ビット演算
なんて物も考えられるかな?
まずは簡単な使い方。
128ビットの領域を確保して任意のビットの値を取得したりセットしたり...
bitset<128> bits;
bits.reset(); // 全ビットクリア
bits[10] = 1; // 10bit目を1に設定
cout << bits[10] << endl; // 10bit目の値を表示
bits.set( 10, 0 ); // 10bit目を0に設定
[]演算子がオーバロードされているから、特定ビットの値を取得したり書き換えたりが簡単にできる。
自分で書いてみると分かるけど、これと同じ挙動するクラスを書くのはちょっと面倒。
コード量とかって言うより適切なバイト位置を経産してビットシフトして...って実装をすると結構バグるもんです。
ただ、このままやと単なるビットしか扱えないのでちょっと不便。
という事で、以下のようなメンバ関数があったら良いんではないかな?
void set_value( int p, int n, int len )
{
for ( int i = 0; i < len; i++ )
bits[p+i] = (n >> i) & 1;
}
このコードでは、ビット位置の大きい方がMSBとして処理しています。
bitsetのoperator[]演算子では0以外の値は全て1とみなすようなので、最下位ビットだけを論理積で取得しておく必要があるようやね。同じような感じでget_valueも作っておくと良いでしょう。
bitsetのメンバ一覧を書いておきます。(気づいたものだけやから全部ではないかも)
bitset<N>( 初期値 ) // コンストラクタで初期値(32ビットまで可)が指定可能
bitset<N>::reset() // 全ビットクリア
bitset<N>::set(p) // pビット目を1にする
bitset<N>::set(p,n) // pビット目をnにする ( n == 0 ) ? 0 : 1
bitset<N>::operator[](p, n) // pビット目をnにする
bitset<N>::operator<<(s) // 全体をsビット左シフト(ビット番号の大きい方にシフト)
bitset<N>::operator>>(s) // 全体をsビット右シフト(ビット番号の小さい方にシフト)