boostは噂の通り、熱いですね。ほんとにこれがC++か? と思えるほど。STLを初めて見た時もかなりの衝撃でしたが、boostはその上を行ってます。C++さんはまた遠くに行ってしまったんだね…
そういえばSTLのbitsetはコンパイル時に長さを決めるので扱いづらいなぁという印象を受けたことがあったなぁと思ってboostのbitsetを見てみると、boostには実行時に長さを変えることができるdynamic_bitsetがありました。がんばるなぁ。
試しにboost.pythonを使ってPythonから使えるモジュールにしてみました。
Python 2.5.1 (r251:54863, Oct 30 2007, 13:45:26)
[GCC 4.1.2 20070925 (Red Hat 4.1.2-33)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import bitset
>>> b=bitset.bitset(12)
>>> b
bitset("000000000000")
>>> len(b)
12
>>> dir(b)
['__and__', '__class__', '__delattr__', '__dict__', '__doc__', '__eq__', '__ge__',
'__getattribute__', '__getitem__', '__gt__', '__hash__', '__iand__', '__ilshift__',
'__init__', '__instance_size__', '__invert__', '__ior__', '__irshift__', '__isub__',
'__ixor__', '__le__', '__len__', '__lshift__', '__lt__', '__module__', '__ne__',
'__new__', '__nonzero__', '__or__', '__reduce__', '__reduce_ex__', '__repr__',
'__rshift__', '__setattr__', '__setitem__', '__str__', '__sub__', '__weakref__',
'__xor__', 'any', 'clear', 'count', 'find_first', 'find_next', 'flip',
'is_proper_subset_of', 'is_subset_of', 'none', 'num_blocks',
'push_back', 'reset', 'resize', 'swap', 'to_ulong']
>>> b[4]=1
>>> print b
000000010000
>>> b
bitset("000000010000")
>>> b.flip()
>>> b
bitset("111111101111")
>>> b.flip()
>>> b
bitset("000000010000")
>>> b.flip(2)
>>> b
bitset("000000010100")
>>> b[4:9]
bitset("00001")
>>> b[-1]
False
>>> b[:5]
bitset("10100")
普通にto_string()を使ってるのに、バイトオーダの影響か、後ろから表示されてますね。boostもboost.pythonもまだよくわからない部分が多いですが、使えなくもないと思います。b1&b2,b1|b2,b1^b2とか~b1といった演算、あとシフトと引き算、大小比較もboostのものをそのまま使ってやってます。