Демонстрационная проблема: даны два 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;
}
Есть ли простой способ сделать это?