将整数的位X设置为另一个整数的位Y而不进行分支?

时间:2014-08-11 05:24:05

标签: c++ c++11 optimization bit-manipulation branch-prediction

以下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回答问题。

3 个答案:

答案 0 :(得分:9)

你可以这样做:

//Change the bit if and only if they are not equal:
out ^= (((out >> out_bit) ^ (in >> in_bit)) & 1) << out_bit;

(移动两个值,使得所需的位在&gt;&gt;的最低位置,用&amp;只选择^操作结果的低位;然后将结果移动到否则为零的位置-value到^与原始目的地。结果与复制bit in_bit in-bit out_bit out相同。)

答案 1 :(得分:6)

在一行中执行此操作的一种方法是首先将输出位重置为零,然后将其与in数字的任何位进行OR运算:

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

答案 2 :(得分:4)

试试这个:

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)将该位置于正确的位置。