C++ 将std::位集分成两半?

C++ 将std::位集分成两半?,c++,c++11,std-bitset,C++,C++11,Std Bitset,我正在实现DES算法,需要将std::bitset permutationKey分成两半 std::bitset<56> permutationKey(0x133457799BBCDF); std::bitset<28> leftKey; std::bitset<28> rightKey; std::bitset<56> divider(0b00000000000000000000000000001111111111111111111111111

我正在实现DES算法,需要将
std::bitset permutationKey
分成两半

std::bitset<56> permutationKey(0x133457799BBCDF);
std::bitset<28> leftKey;
std::bitset<28> rightKey;

std::bitset<56> divider(0b00000000000000000000000000001111111111111111111111111111);

rightKey = permutationKey & divider;
leftKey = (permutationKey >> 28) & divider;
如何像这样拆分
位集?

std::位集置换键(0x133457799BBCDF);
std::bitset<56> permutationKey(0x133457799BBCDF);
std::bitset<56> divider(0b00000000000000000000000000001111111111111111111111111111);

auto rightKey = std::bitset<28> ( (permutationKey & divider).to_ulong() );
auto leftKey = std::bitset<28> ( ((permutationKey >> 28) & divider).to_ulong() );
std::位集除法器(0B0000000000000000111111111111); auto rightKey=std::位集((置换键和除法器).to_ulong()); 自动leftKey=std::位集((置换键>>28)和除法器);
前面的答案中提出的解决方案很好,但不是一般性的:我们如何拆分一个非常大的位集,以便在不丢失位的情况下转换为
u\u long
? 直观地说,我们在这里查找迭代器和范围:

vector<int> vec({1,2,3,4});
vector<int> vec1(vec.begin(), vec.begin() + vec.size() / 2); // {1,2}
vector<int> vec2(vec.begin() + vec.size() / 2, vec.end()); // // {3,4}
向量向量向量({1,2,3,4}); 向量vec1(vec.begin(),vec.begin()+vec.size()/2);//{1,2} 向量vec2(vec.begin()+vec.size()/2,vec.end());///{3,4}
不幸的是,位集没有迭代器和范围。如果您不太关心转换的速度,我将提出以下简单而通用的解决方案:

const size_t size = ...  // we assume size is even
bitset<size> bss;
.......
const string str = bss.to_string();
bitset<size/2>bss1(str.substr(0, str.size() / 2));          // first half
bitset<size/2>bss2(str.substr(str.size() / 2, str.size())); // second half
const size\u t size=…//我们假设大小相等
位集bss;
.......
常量字符串str=bss.to_string();
bitsetbss1(str.substr(0,str.size()/2));//上半场
bitsetbss2(str.substr(str.size()/2,str.size());//下半场

好的,旧的位掩码和移位可能会派上用场。这是最后一个选项:-)你甚至可以考虑提供这样一个函数的模板版本(实例化某些甚至大小)来做这件事。我认为使用原始类型在这里会更合适。嗯,它是有效的。哇!就是这么简单:-)。文档是新的黑色。你应该买一些!;-)因此,如果不先将位集转换为ulong,就无法从另一个位集创建位集?这门课很令人失望。对位操作不是很强大。@Jasancos您当然可以复制并构造相同大小的位集。此解决方案将生成2个大小不同于源对象的位集。
const size_t size = ...  // we assume size is even
bitset<size> bss;
.......
const string str = bss.to_string();
bitset<size/2>bss1(str.substr(0, str.size() / 2));          // first half
bitset<size/2>bss2(str.substr(str.size() / 2, str.size())); // second half