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
ややこしいビット演算を隠蔽できるので活用したいと思います。