トップページ > コンテナとイテレータ >
サンプルの動作確認バージョン [GCC4.4/1.41.0] [VC9/1.41.0]
#include <iostream>
#include <boost/dynamic_bitset.hpp>
using namespace std;
int main()
{
// 10bitのbitsetを二つ
boost::dynamic_bitset<> a(10);
boost::dynamic_bitset<> b(10);
// 0番目3番目5番目のbitを立てたものと、
// 1,3,8,9番目のbitを立てたものです
a[0] = a[3] = a[5] = 1;
b[1] = b[3] = b[8] = b[9] = 1;
// bit演算色々
boost::dynamic_bitset<> c = a&b;
boost::dynamic_bitset<> d = a^b;
boost::dynamic_bitset<> e = a<<3;
cout << c << endl << d << endl << e << endl;
// cはeに含まれているか?
cout << (c.is_subset_of(e) ? "yes" : "no") << endl;
return 0;
}
0000001000 1100100011 0101001000 yes
dynamicである点を生かせてないサンプルなので、
たぶんそのうち書き直します。赤くなくて四駆で左ハンドルの車~
「dynamic_bitset<> red( NumOfCars ), _4wd( NumOfCars ),
lefthand( NumOfCars ); dynamic_bitset<> n4l = (~red) & _4wd &
lefthand;
」とかかなぁ。
車の数は実行時に入力データとして与えられるという設定で。
STLには、ビットの集合を表す手として bitset
や
vector<bool>
や valarray<bool>
などがありますが、bitsetはサイズはコンパイル時に決めた値固定。
vectorやvalarrayはサイズは可変ですが、
ビット集合全体に対して一気にビット演算を施す方法が不十分です。
(valarrayではシフト演算が出来ない。)
勿論大抵の場合はbitsetかvectorで十分役目を果たすのですが、 サイズを実行時に決めることが出来てしかもビット演算が出来るクラス、 となると別のクラスが欲しいところ。そこで dynamic_bitsetの出番であります。
集合の包含関係を扱うのを主な用途として作られたらしく、
bitsetのメンバ関数に加え、is_subset_of
と
is_proper_subset_of
という関数が加わっているところが注目ポイントです。