4

の値test1またはであるとします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、または のいずれかです。 それを行うための提案はありますか?test2test301

4

2 に答える 2

4

元のifステートメントでこれを意味していたと思います。

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

テストの前ではないため、テストが 1 の場合は a+b ではなく、テストが 0 の場合は 0 であり、必要な場合を除いて各ケースが 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 に答える