Демонстрационная проблема: учитывая две 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();
}
Это решение плохое, потому что оно идет по одному разу, что не идеально:
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
или любой тип, который хранит 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;
}
Есть ли простой способ сделать это?