我有三个无符号的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语句吗?
答案 0 :(得分:6)
有很多方法可以做到这一点。 这是另一个,没有乘法,只有4个操作。
c ^= a&(-(b&1));
答案 1 :(得分:4)
这应该有效
c ^= a * ( b & 1 );
答案 2 :(得分:3)
如果没有if
语句且没有分支,则必须检查编译器的程序集转储:
c ^= ~((b & 1) - 1) & a;