Может ли copy_bit
Функция ниже будет упрощена до чего-то вроде out[out_bit] = in[in_bit]
? (т.е. не используя if
заявление)
template< typename T >
inline void copy_bit( T& out, const T in, const std::size_t out_bit, const std::size_t in_bit )
{
if ( (in & (1 << in_bit)) != 0 )
{
out |= (1 << out_bit); // Set bit
}
else
{
out &= ~(1 << out_bit); // Clear bit
}
}
// Set bit 4 in x to bit 11 in y
copy_bit( x, y, 4, 11 );
Обновить: Просто чтобы прояснить, это не домашняя работа или проблема XY, где предложение std::bitset
отвечает на вопрос.
Вы можете сделать это так:
//Change the bit if and only if they are not equal:
out ^= (((out >> out_bit) ^ (in >> in_bit)) & 1) << out_bit;
(Сдвиньте оба значения так, чтобы требуемые биты находились в наименее значимой позиции с помощью >>, выберите с помощью & только младший бит результата операции ^; затем сдвиньте результат в положение с другим нулевым значением в ^ с первоначальным назначением. Результат аналогичен копированию бита in_bit of in в бит out_bit of out.)
Один из способов сделать это в одной строке — сначала сбросить бит вывода на ноль, а затем ИЛИ с любым другим битом in
номер имеет:
(out &= ~(1 << out_bit)) |= (((in >> in_bit) & 1) << out_bit)
Попробуй это:
template< typename T >
inline void copy_bit( T& out, const T in, const std::size_t out_bit, const std::size_t in_bit )
{
out = (out & ~(1 << out_bit)) | (((in & (1 << in_bit)) >> in_bit) << out_bit);
}
Объяснение:
(out & ~(1 << out_bit))
оставить кусочки out
это не интересно(in & (1 << in_bit)
выберите бит in
это интересно(((in & (1 << in_bit)) >> in_bit) << out_bit)
расположите бит в правильном положении.