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

evrscar2  于 2023-11-19  发布在  其他
关注(0)|答案(3)|浏览(111)

下面的copy_bit函数可以简化为类似out[out_bit] = in[in_bit]的东西吗?(即不使用if语句)

  1. template< typename T >
  2. inline void copy_bit( T& out, const T in, const std::size_t out_bit, const std::size_t in_bit )
  3. {
  4. if ( (in & (1 << in_bit)) != 0 )
  5. {
  6. out |= (1 << out_bit); // Set bit
  7. }
  8. else
  9. {
  10. out &= ~(1 << out_bit); // Clear bit
  11. }
  12. }
  13. // Set bit 4 in x to bit 11 in y
  14. copy_bit( x, y, 4, 11 );

字符串

**更新:**需要说明的是,这不是家庭作业或XY问题,建议std::bitset回答问题。

o4hqfura

o4hqfura1#

你可以这样做

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

字符串
(使用>>移动两个值,使所需的位位于最低有效位,使用&仅选择^操作结果的较低位;然后将结果移动到原始目的地的否则为零值的位置^。结果与将in的bit in_bit复制到out的bit out_bit相同。)

2nbm6dog

2nbm6dog2#

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

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

字符串

kxkpmulp

kxkpmulp3#

试试这个:

  1. template< typename T >
  2. inline void copy_bit( T& out, const T in, const std::size_t out_bit, const std::size_t in_bit )
  3. {
  4. out = (out & ~(1 << out_bit)) | (((in & (1 << in_bit)) >> in_bit) << out_bit);
  5. }

字符串
说明:

  • (out & ~(1 << out_bit))保留out中不感兴趣的位。
  • (in & (1 << in_bit)选择in中感兴趣的位
  • (((in & (1 << in_bit)) >> in_bit) << out_bit)将钻头定位在正确位置。

相关问题