boost::dynamic_bitset

トップページ > コンテナとイテレータ >

abstract

必要なヘッダ
<boost/dynamic_bitset.hpp>
出来ること
実行時に大きさを変えられるbitset
リファレンス
en

sample

サンプルの動作確認バージョン [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;」とかかなぁ。 車の数は実行時に入力データとして与えられるという設定で。

etc

STLには、ビットの集合を表す手として bitsetvector<bool>valarray<bool> などがありますが、bitsetはサイズはコンパイル時に決めた値固定。 vectorやvalarrayはサイズは可変ですが、 ビット集合全体に対して一気にビット演算を施す方法が不十分です。 (valarrayではシフト演算が出来ない。)

勿論大抵の場合はbitsetかvectorで十分役目を果たすのですが、 サイズを実行時に決めることが出来てしかもビット演算が出来るクラス、 となると別のクラスが欲しいところ。そこで dynamic_bitsetの出番であります。

集合の包含関係を扱うのを主な用途として作られたらしく、 bitsetのメンバ関数に加え、is_subset_ofis_proper_subset_of という関数が加わっているところが注目ポイントです。

presented by k.inaba (kiki .a.t. kmonos.net) under CC0