std::bitset
具有位移运算符,因此例如您可以编写一个函数将位(begin,end]
放在前面:
template <size_t size>
std::bitset<size> extract_bits(std::bitset<size> x,int begin, int end) {
(x >>= (size-end)) <<= (size-end);
x <<= begin;
return x;
}
例如要获取位 1 和 2:
int main()
{
std::bitset<6> x{12};
std::cout << x << "\n";
std::cout << extract_bits(x,1,3);
}
输出:
001100
010000
如果你知道begin
并且end
在编译时你可以得到一个std::bitset
只包含所需位的:
template <size_t begin,size_t end,size_t in>
std::bitset<end-begin> crop(const std::bitset<in>& x) {
return std::bitset<end-begin>{ x.to_string().substr(begin,end-begin) };
};
auto c = crop<1,3>(x);
std::cout << c; // 01
如果位集太大而无法放入unsigned long long
我不知道另一种不使用to_string()
或循环单个位的方式。