C++快速Bitset短路按位操作

Tra*_*kel 8 c++ bitvector

一个演示问题:给定两个std::bitset<N>S,ab检查是否有任何比特都设定ab.

这个问题有两个相当明显的解决方案.这很糟糕,因为它会创建一个新的临时位集,并复制各种位置的值只是为了抛弃它们.

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_typeuint32_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)

这样做有简单的方法吗?

Ben*_*son 6

我用优化编译了你的第一个例子,g++它产生的代码与你的第三个解决方案相同.事实上,使用一个小的bitset(320位),它完全展开它.没有调用函数来确保其中的内容ab未知内容main实际上优化了整个事物(知道两者都是0).

课程:编写明显可读的代码,让编译器处理它.