C++ C+中动态位集的快速分割+;

C++ C+中动态位集的快速分割+;,c++,boost,bit-manipulation,C++,Boost,Bit Manipulation,我觉得这个标题很能自我解释。我的代码中有一个boost::dynamic_位集,我希望对其进行快速拆分。目前,我正在使用for循环来完成它,但我非常确定有一些更快的方法来完成它,使用位运算符。 例如: B = [0 1 0 0 0 1 1 1 0 1] 我想去掉B[2..5]: B2 = [0 0 0 1] 还有其他方法吗?我会把你想要保留的位复制到一个新的位集中 using namespace std; #include <iostream> #include <boos

我觉得这个标题很能自我解释。我的代码中有一个boost::dynamic_位集,我希望对其进行快速拆分。目前,我正在使用for循环来完成它,但我非常确定有一些更快的方法来完成它,使用位运算符。 例如:

B = [0 1 0 0 0 1 1 1 0 1]
我想去掉B[2..5]:

B2 = [0 0 0 1]

还有其他方法吗?

我会把你想要保留的位复制到一个新的位集中

using namespace std;
#include <iostream>
#include <boost/dynamic_bitset.hpp>
int main() 
{
    boost::dynamic_bitset<> B(10); 
    //Set bits, default is 0
    B[1] = 1;
    B[5] = 1;
    B[6] = 1;
    B[7] = 1;
    B[9] = 1;
    //Print out current bitset
    std::cout << "B: ";
    for (boost::dynamic_bitset<>::size_type i = 0; i < B.size(); ++i)
      std::cout << B[i];

    std::cout << "\n";
    //Create a new bitset
    boost::dynamic_bitset<> B2(6); 
    B2[0] = B[0];
    B2[1] = B[1];
    B2[2] = B[6];
    B2[3] = B[7];
    B2[4] = B[8];
    B2[5] = B[9];

    //Print out B2
    std::cout << "\n";
    std::cout << B2 << "\n";
    return 0;
}
使用名称空间std;
#包括
#包括
int main()
{
boost::动态_比特集B(10);
//设置位,默认为0
B[1]=1;
B[5]=1;
B[6]=1;
B[7]=1;
B[9]=1;
//打印当前位集

std::cout我只需将要保留的位复制到新的位集中

using namespace std;
#include <iostream>
#include <boost/dynamic_bitset.hpp>
int main() 
{
    boost::dynamic_bitset<> B(10); 
    //Set bits, default is 0
    B[1] = 1;
    B[5] = 1;
    B[6] = 1;
    B[7] = 1;
    B[9] = 1;
    //Print out current bitset
    std::cout << "B: ";
    for (boost::dynamic_bitset<>::size_type i = 0; i < B.size(); ++i)
      std::cout << B[i];

    std::cout << "\n";
    //Create a new bitset
    boost::dynamic_bitset<> B2(6); 
    B2[0] = B[0];
    B2[1] = B[1];
    B2[2] = B[6];
    B2[3] = B[7];
    B2[4] = B[8];
    B2[5] = B[9];

    //Print out B2
    std::cout << "\n";
    std::cout << B2 << "\n";
    return 0;
}
使用名称空间std;
#包括
#包括
int main()
{
boost::动态_比特集B(10);
//设置位,默认为0
B[1]=1;
B[5]=1;
B[6]=1;
B[7]=1;
B[9]=1;
//打印当前位集

std::cout可以通过遮罩、移位和调整大小来实现:

boost::dynamic_bitset<> B(10);
B[1] = 1;
B[5] = 1;
B[6] = 1;
B[7] = 1;
B[9] = 1;

boost::dynamic_bitset<> mask(B.size(), 0xf << 2);
boost::dynamic_bitset<> B2(B.size());

B2 = (B & mask) >> 2;
B2.resize(4);
boost::动态位集B(10);
B[1]=1;
B[5]=1;
B[6]=1;
B[7]=1;
B[9]=1;
动态位集掩码(B.size(),0xf>2;
B2.调整大小(4);

可以通过遮罩、移位和调整大小来实现:

boost::dynamic_bitset<> B(10);
B[1] = 1;
B[5] = 1;
B[6] = 1;
B[7] = 1;
B[9] = 1;

boost::dynamic_bitset<> mask(B.size(), 0xf << 2);
boost::dynamic_bitset<> B2(B.size());

B2 = (B & mask) >> 2;
B2.resize(4);
boost::动态位集B(10);
B[1]=1;
B[5]=1;
B[6]=1;
B[7]=1;
B[9]=1;
动态位集掩码(B.size(),0xf>2;
B2.调整大小(4);

您能更好地解释一下它是如何工作的吗?更具体地说,行boost::dynamic_位集掩码(B.size(),0xf)是如何工作的。因此,例如,如果我需要位4~10,我会将掩码移位4,对吗?是的,两个位置都精确(将掩码移位,然后在应用掩码后将结果移位)你能更好地解释一下它是如何工作的吗?更具体地说,行boost::dynamic_位集掩码(B.size(),0xf)是如何工作的。因此,例如,如果我需要位4~10,我会将掩码移位4,对吗?是的,两个位置都是正确的(将掩码移位,然后在应用掩码后将结果移位)谢谢你的回答,但这是非常明显的。如果我知道在编译时设置了哪些位,那么这样做是没有意义的。任何关于任意大小的位集的选项,以及那些在运行时设置的吗?谢谢你的回答,但这是非常明显的。如果我知道在编译时设置了哪些位,那么这样做是没有意义的。任何关于任意大小的选项d位集,以及在运行时设置的位集?