Page List

Search on the blog

2011年4月27日水曜日

知ってると便利なSTL(7) bitset

C++のSTL紹介第7弾。
今日のは、かなり便利です。その名もbitset。
名前のとおり10進数を2進数に変換してくれます。

使い方は、 bitset<ビット長>(数値)とするだけ。
自分で作らなくても、c++標準関数に二進数変換機能があったんですねー@_@

以下、ビット演算でいろいろやってます。
基本的なものが多いですが、最後に書いてるn & -nは、なかなかマニアックです。(アルゴリズマーにとっては、常識の範疇??)
n & -nでnのnon-zero LSBが取れます!


  1. #include <bitset>  
  2.   
  3. int main() {  
  4.   
  5.    int a = 20004;  
  6.   
  7.    // high 7 and 8 bits  
  8.    int mask = 1 << 8 | 1 << 7;  
  9.    cout << bitset<16>(a) << endl;  
  10.    cout << bitset<16>(a | mask) << endl << endl;  
  11.   
  12.    // low 9 and 10 bits  
  13.    mask = 1 << 9 | 1 << 10;  
  14.    cout << bitset<16>(a) << endl;  
  15.    cout << bitset<16>(a & ~mask) << endl << endl;  
  16.   
  17.    // flip 0 and 1 bits  
  18.    mask = 1 << 0 | 1 << 1;  
  19.    cout << bitset<16>(a) << endl;  
  20.    cout << bitset<16>(a ^ mask) << endl << endl;  
  21.   
  22.    // the leaset significant non-zero bit  
  23.    cout << bitset<16>(a) << endl;  
  24.    cout << bitset<16>(-a) << endl;  
  25.    cout << bitset<16>(a&-a) << endl;  
  26.   
  27.    return 0;  
  28. }  
追記:
メンバ関数to_string()を使えば、対応するString型をえることができます。
string x = bitset<16>(a&-a).to_string();
のようにすればよいです。

0 件のコメント:

コメントを投稿