实现if - else如果使用按位运算符

时间:2013-06-02 01:30:08

标签: c loops if-statement logic bit-manipulation

假设test的值为10。在这里,我可以使用按位运算符实现以下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;

test1test2test3的值为01

有任何建议吗?

2 个答案:

答案 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;
}

如果你很幸运(如果它加快了速度),编译器将使用跳转表实现切换。

但是,你真的不得不质疑,这些棘手的解决方案是否提供足够的速度提升(如果他们这样做)来证明额外的复杂性。我假设你试图避免分支。