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

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

boost::dynamic_bitsetから部分ビット列を切り出す

boost::dynamic_bitsetをさわったついでに、もとのビット列から部分ビット列を切り出す方法を探してみたんですが、どうも見つかりません。

イテレータがあればこんな感じで書けると思うのですが。

// 注意:これはイメージです。コンパイルできません。
// もとのビット列b2のビット3の位置から9ビット切り出す
boost::dynamic_bitset<> b2(b1.begin() + 3, b1.begin() + 3 + 9);


仕方がないので文字列を経由してみます。

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

int main(int, char* [])
{
    // もとのビット列
    boost::dynamic_bitset<> b1(std::string("10110011100011110000"));

    std::cout << b1 << std::endl;

    // ビット列を文字列にする
    std::string s1;
    to_string(b1, s1);

    // 文字列の3文字目から9文字分を切り取る(ただし逆順)
    std::string s2(std::string(s1.rbegin() + 3, s1.rbegin() + 3 + 9));

    // 切り出した文字列は逆順なので、反転してから、ビット列に格納する
    boost::dynamic_bitset<> b2(std::string(s2.rbegin(), s2.rend()));

    // もとのビット列のビット3の位置から9ビットを切り出したビット列
    std::cout << "________" << b2 << "___" << std::endl;

    return 0;
}


実行結果。

10110011100011110000
________100011110___


どう考えても素直にコピーした方がはやそうだ。

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

int main(int, char* [])
{
    boost::dynamic_bitset<> b1(std::string("10110011100011110000"));

    std::cout << b1 << std::endl;

    boost::dynamic_bitset<> b2(9);

    for(int i = 0; i < 9; ++i)
    {
        b2[i] = b1[i + 3];
    }

    std::cout << "________" << b2 << "___" << std::endl;

    return 0;
}


つづく。