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

问题描述 投票:0回答:3

下面的

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

c++ optimization bit-manipulation branchless
3个回答
9
投票

你可以这样做:

//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 相同。)


6
投票

在一行中执行此操作的一种方法是首先将输出位重置为零,然后将其与

in
数字具有的任何位进行或:

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

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)
    将钻头定位在正确的位置。
© www.soinside.com 2019 - 2024. All rights reserved.