一个演示问题:给定两个std::bitset<N>S,a并b检查是否有任何比特都设定a和b.
这个问题有两个相当明显的解决方案.这很糟糕,因为它会创建一个新的临时位集,并复制各种位置的值只是为了抛弃它们.
template <size_t N>
bool any_both_new_temp(const std::bitset<N>& a, const std::bitset<N>& b)
{
return (a & b).any();
}
Run Code Online (Sandbox Code Playgroud)
这个解决方案很糟糕,因为它一次只有一点,这不太理想:
template <size_t N>
bool any_both_bit_by_bit(const std::bitset<N>& a, const std::bitset<N>& b)
{
for (size_t i = 0; i < N; ++i)
if (a[i] && b[i])
return true;
return false;
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,我将能够做这样的事情,在这里block_type是uint32_t或任何类型bitset的存储:
template <size_t N>
bool any_both_by_block(const std::bitset<N>& a, const std::bitset<N>& b)
{
typedef std::bitset<N>::block_type block_type;
for (size_t i = 0; i < a.block_count(); ++i)
if (a.get_block(i) & b.get_block(i))
return true;
return false;
}
Run Code Online (Sandbox Code Playgroud)
这样做有简单的方法吗?
我用优化编译了你的第一个例子,g++它产生的代码与你的第三个解决方案相同.事实上,使用一个小的bitset(320位),它完全展开它.没有调用函数来确保其中的内容a和b未知内容main实际上优化了整个事物(知道两者都是0).
课程:编写明显可读的代码,让编译器处理它.