【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ビット右シフト(ビット番号の小さい方にシフト)

Author: kan
初めてプログラムらしきものを作ったのは幼稚園の時。それから約40年経ち、現在はデジタル回路設計から信号処理、機械学習まで幅広い経験を活かしてシステムアーキテクトとして活動中。超並列処理、デジタル回路とソフトウェアのバランス設計が得意分野。 Linux/Mac/Windows使い。 C/C++を主要言語として、Unity、Qtなどのフレームワーク興味あり。UI/UXデザイン、STL拡張など。 音声処理、画像処理、技術コンサルは仕事でも請け負います。 一般ソフトウェア開発プロセス、医療機器ソフトウェア開発プロセス作成も進行中。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください