C ++ Быстрые побитовые операции с коротким замыканием битов

Демонстрационная проблема: даны два std :: bitset 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();
}

Это решение плохое, потому что оно передается по одному биту за раз, что далеко не идеально:

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;
}

В идеале я мог бы сделать что-то вроде этого, где block_type равно uint32_t или любого другого типа, который хранится в битовом наборе :

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;
}

Есть ли простой способ сделать это?

8
задан Travis Gockel 2 December 2011 в 00:24
поделиться