如果设置了最低位,则有条件地无分支异或

XOR conditionally without branching if the lowest bit is set

本文关键字:有条件 分支 设置 如果      更新时间:2023-10-16

我有三个无符号32位整数,例如a, bc。如果b的最低位是1,我想将ca异或,并将结果存储到c中。我们可以这样做:

#include <cassert>
int main()
{
  // Some values for a and c
  unsigned a = 16;
  unsigned c = 25;
  unsigned b = 5; // 101_2
  if(b & 1)
  {
    c ^= a;
  }
  assert(c == 9);
}

我可以在没有分支的情况下有条件地执行此操作吗,也就是说,没有if语句?

有很多方法可以做到这一点。这是另一个,没有乘法,只有4个运算。

c ^= a&(-(b&1));

应该可以了

c ^= a * ( b & 1 );

如果没有if语句和分支,您必须检查编译器的汇编转储:

c ^= ~((b & 1) - 1) & a;