假设test
的值为1
或0
。在这里,我可以使用按位运算符实现以下if语句。
if (test)
output = a;
else
output = b;
使用位运算符
output = (((test << 31) >> 31) & a) | (((test << 31) >> 31) & b);
现在我想使用按位运算符实现以下if语句。
if (test1)
output = a;
else if (test2)
output = b;
else if (test3)
output = c;
else
output = d;
test1
,test2
,test3
的值为0
或1
。
有任何建议吗?
答案 0 :(得分:3)
我认为你的意思是原来的if语句。
output = (((test << 31) >> 31) & a) | (((!test << 31) >> 31) & b);
不在测试前面,当测试为1时,这不是a + b,当测试为0时,我不是{0}我将+
替换为|
,因为每个案例应该为0,除了一个你想要的。
要执行cascaded if else if else语句,您可以重写表达式 它们依赖于之前的测试。
if (test1)
output = a
if (!test1 & test2)
output = b
if (!test1 & !test2 & test3)
output = c
if (!test1 & !test2 & !test3)
output = d
对于所有if else ifs,这会导致这样的表达式。
output = (((test1 << 31) >> 31) & a)
| ((((!test1 & test2) << 31) >> 31) & b)
| ((((!test1 & !test2 & test3) << 31) >> 31) & c)
| ((((!test1 & !test2 & !test3) << 31) >> 31) & d)
答案 1 :(得分:0)
它是否是按位运算符?怎么样:
output = ( test1) * a +
(1 - test1) * (( test2) * b +
(1 - test2) * (( test3) * c +
(1 - test3) * d));
仅使用逐位运算符的另一种可能性是:
switch ((test1 << 2) | (test2 << 1) | test3) {
case 0: output = d; break;
case 1: output = c; break;
case 2:
case 3: output = b; break;
case 4:
case 5:
case 6:
case 7: output = a; break;
}
如果你很幸运(如果它加快了速度),编译器将使用跳转表实现切换。
但是,你真的不得不质疑,这些棘手的解决方案是否提供足够的速度提升(如果他们这样做)来证明额外的复杂性。我假设你试图避免分支。