将一个整数的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回答问题。

你可以这样做:

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

(用>>移动两个值,使所需的位位于最低有效位,用&只有^运算结果的低位;然后将结果移动到一个不为零的值的位置到^与原始目标。结果与将in的in_bit位复制到out的out_bit位相同。)

在一行中这样做的一种方法是首先将输出位重置为零,然后将其与in数字的任何位进行OR:

(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)将位定位到正确位置。

相关内容

  • 没有找到相关文章

最新更新