我遇到的情况是需要将多个位集块分成两半。是否可以将以下两个功能合并为类似于第三个功能的方法?拥有类似第三者的感觉更正确,更普遍。
pair<bitset<32>, bitset<32> >
split_block_in_half(
bitset<64> block
){
bitset<block.size()> filter;
for(size_t i = 0; i < filter.size()/2; ++i){
filter.set(i);
}
return make_pair<bitset<block.size()/2>, bitset<block.size()/2> >(
bitset<block.size()/2>(((block ^ (filter << (block.size()/2))) >> (block.size()/2)).to_ulong()),
bitset<block.size()/2>((block ^ filter).to_ulong())
);
}
pair<bitset<28>, bitset<28> >
split_block_in_half(
bitset<56> block
){
bitset<block.size()> filter;
for(size_t i = 0; i < filter.size()/2; ++i){
filter.set(i);
}
return make_pair<bitset<block.size()/2>, bitset<block.size()/2> >(
bitset<block.size()/2>(((block ^ (filter << (block.size()/2))) >> (block.size()/2)).to_ulong()),
bitset<block.size()/2>((block ^ filter).to_ulong())
);
}
template<
typename N>
pair<bitset<N>, bitset<N> >
split_block_in_half(
bitset<2*N> block
){
bitset<block.size()> filter;
for(size_t i = 0; i < filter.size()/2; ++i){
filter.set(i);
}
return make_pair<bitset<block.size()/2>, bitset<block.size()/2> >(
bitset<block.size()/2>(((block ^ (filter << (block.size()/2))) >> (block.size()/2)).to_ulong()),
bitset<block.size()/2>((block ^ filter).to_ulong())
);
}
是否有一种巧妙的编译方式来合并上面的两个单独的函数,或者这是不受支持的?
答案 0 :(得分:3)
尝试在模板参数中输入一个整数值:
template <int N>
pair<bitset<N>, bitset<N>>
split_block_in_half(
bitset<2*N> block
)
......
不利之处在于,由于无法从函数调用中推断出2*N
,因此您需要明确指定N:
split_block_in_half<28>(block); // where block is bitset<56>
如果这样定义,则可以使用SFINAE限制N为偶数。
template <int N>
std::enable_if_t<
N % 2 == 0,
pair<bitset<N/2>, bitset<N/2>>
>
split_block_in_half(bitset<N>);
如果您没有C ++ 14,请将std::enable_if_t<>
更改为typename std::enable_if<>::type
(C ++ 11)。
答案 1 :(得分:2)
这是一个完整的工作示例,不需要指定N
。我实现逻辑有些不同。我假设目标是使该对的first
成员包含高阶位,并使second
包含低阶位。请注意,^
是logical XOR操作,尽管它可能类似于有时在命题逻辑中使用的逻辑与。
template<size_t N>
pair<bitset<N/2>, bitset<N/2>> split_block_in_half(const bitset<N>& block){
static_assert(N % 2 == 0 && N != 0, "N must be even and non-zero");
pair<bitset<N/2>, bitset<N/2>> ret;
for (size_t i = 0; i < N/2; ++i){
ret.first[i] = block[i + N/2];
ret.second[i] = block[i];
}
return ret;
}
int main() {
bitset<64> bs { 0x1234567887654321 };
auto halves = split_block_in_half(bs);
std::cout << std::hex
<< halves.first.to_ullong() << '\n'
<< halves.second.to_ullong() << '\n';
// prints:
// > 12345678
// > 87654321
return 0;
}