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

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

我有三个无符号 32 位整数,例如

a
b
c
。如果
b
的最低位是1,我想将
c
a
进行异或,并将结果存储到
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 语句吗?

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

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

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

4
投票

这应该有效

c ^= a * ( b & 1 );

3
投票

没有

if
语句并且没有分支,您必须检查编译器的程序集转储:

c ^= ~((b & 1) - 1) & a;
© www.soinside.com 2019 - 2024. All rights reserved.