エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

boost::dynamic_bitset

ちょっと触れる機会があったので、わかったことを整理&記録。

#include <iostream>
#include <boost/dynamic_bitset.hpp>

int main(int, char* [])
{
    boost::dynamic_bitset<> n;

    n.append(85);
    n.append(255);

    std::cout << n << std::endl;

    return 0;
}


実行結果

0000000000000000000000001111111100000000000000000000000001010101

boost::dynamic_bitsetの「ブロック」の大きさは、デフォルトではunsigned longなので、ひとつ数値を追加すると(この実装では)32ビットが追加されます。またあとから追加された数値が上位ビットに追加されます。


「ブロック」のサイズを変えてみると。

#include <iostream>
#include <boost/dynamic_bitset.hpp>

int main(int, char* [])
{
    boost::dynamic_bitset<unsigned char> n;

    n.append(85);
    n.append(255);

    std::cout << n << std::endl;

    return 0;
}


実行結果

1111111101010101


「ブロック」のサイズがunsigned charのビットサイズ(8)になっています(数値をふたつ追加したので全体で16ビットになっています)。


「ブロック」列を使って初期化することもできます。

#include <iostream>
#include <boost/dynamic_bitset.hpp>

int main(int, char* [])
{
    //                          こっちが下位 <----> こっちが上位
    const unsigned char a[] = { 1, 3, 7, 15, 31, 63, 127, 255 };

    boost::dynamic_bitset<unsigned char> n(a, a + sizeof(a));

    std::cout << n << std::endl;

    return 0;
}


実行結果

1111111101111111001111110001111100001111000001110000001100000001