bitsetクラス

http://www.geocities.jp/ky_webid/cpp/library/008.html

ビット演算をオブジェクトとして扱えるようにするためのクラス。

これは便利ですね。

兎に角実装してみましょう。

#include <iostream>
#include <bitset>
using namespace std;

int main () {
    // 8ビットのデータ
    bitset<8> bs;
    
    // ビットのサイズ
    cout << "size = " << bs.size() << endl;
    
    // 1番目と2番目のビットを立てる
    bs.set( 1 );
    bs.set( 2 );
    
    // どれか一つでもビットが立っていたら
    if ( bs.any() ) {
        // 立っているビットを確認する
        if ( bs[0] ) { cout << "bs[0] = ON" << endl; }
        if ( bs[1] ) { cout << "bs[1] = ON" << endl; }
        if ( bs[2] ) { cout << "bs[2] = ON" << endl; }
        if ( bs[3] ) { cout << "bs[3] = ON" << endl; }
    }
    
    // ビットを文字列に変換する
    cout << "to_string = " << bs.to_string() << endl;
    
    // ビットを反転する
    bs.flip();
    cout << "to_string = " << bs.to_string() << endl;
    
    // ビットを数値に変換する
    cout << "to_ulong = " << bs.to_ulong() << endl;
    
    // 2番目のビットだけを落とす
    bs.reset( 2 );
    
    // 引数なしsetは全ビットを立てる
    bs.set();
    
    // 引数なしresetは全ビットを落とす
    bs.reset();
    
    // ビットが一つも立っていなかったら
    if ( bs.none() ) {
        cout << "all bit OFF" << endl;
    }
    
    return 0;
}
$ main
size = 8
bs[1] = ON
bs[2] = ON
to_string = 00000110
to_string = 11111001
to_ulong = 249
all bit OFF

詰め込めるだけ詰め込んでみました。

色々痒いところに届く関数があって素晴らしいですね。

このほかにも立っているビットの数を返すcount関数や、ビットの状態を取得するtest関数等があります。

また、ビット演算子もオーバーライドされているので使うことができます。

#include <iostream>
#include <bitset>
using namespace std;

int main () {
    // 8ビットのデータ
    bitset<8> bs;
    
    // 1番目と2番目のビットを立てる
    bs |= 1<<1;
    bs |= 1<<2;
    
    if ( bs[0] ) { cout << "bs[0] = ON" << endl; }
    if ( bs[1] ) { cout << "bs[1] = ON" << endl; }
    if ( bs[2] ) { cout << "bs[2] = ON" << endl; }
    if ( bs[3] ) { cout << "bs[3] = ON" << endl; }
    
    return 0;
}
$ main
bs[1] = ON
bs[2] = ON

ややこしいビット演算を隠蔽できるので活用したいと思います。