7

下面的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 );

更新:为了清楚起见,这不是家庭作业或建议std::bitset回答问题的 XY 问题。

4

3 回答 3

9

你可以这样做:

//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 复制到 bit out_bit of out 相同。)

于 2014-08-11T05:39:27.040 回答
6

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

(out &= ~(1 << out_bit)) |= (((in >> in_bit) & 1) << out_bit)
于 2014-08-11T05:45:33.377 回答
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)将钻头定位在正确的位置。
于 2014-08-11T05:44:08.803 回答