4

假设 的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;

test1, test2,的值test301

有什么建议吗?

4

2 回答 2

4

我假设你的意思是你原来的 if 语句。

output = (((test << 31) >> 31) & a) | (((!test << 31) >> 31) & b);

不在 test 前面,因此当 test 为 1 时这不是 a+b ,而当 test 为 0 时不是 a+b ,我替换+|因为每个案例都应该是 0 除了你想要的那个。

要执行级联 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 if 的表达式都是这样的。

output = (((test1 << 31) >> 31) & a)
         | ((((!test1 & test2) << 31) >> 31) & b)
         | ((((!test1 & !test2 & test3) << 31) >> 31) & c)
         | ((((!test1 & !test2 & !test3) << 31) >> 31) & d)
于 2013-06-02T01:41:59.967 回答
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;
}

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

但是,您确实必须质疑这些棘手的解决方案是否提供了足够的减速带(如果有的话)来证明额外的复杂性是合理的。我假设您正在尝试避免分支。

于 2013-06-02T01:42:44.250 回答