Установить бит X целого числа в бит Y другого целого числа без разветвления?

Может ли 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 отвечает на вопрос.

7

Решение

Вы можете сделать это так:

//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.)

9

Другие решения

Один из способов сделать это в одной строке — сначала сбросить бит вывода на ноль, а затем ИЛИ с любым другим битом in номер имеет:

(out &= ~(1 << out_bit)) |= (((in >> in_bit) & 1) << out_bit)
6

Попробуй это:

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) расположите бит в правильном положении.
4
По вопросам рекламы [email protected]