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; }
つづく。