5

これらの演算子のみを使用していくつかの関数を実行するように要求する割り当てがあります。

!〜&^ | + << >>

いくつかの問題では、整数xを、1が含まれている場合はすべて1にし、0の場合は0のままにしておくと便利です。これを行う理由は、次のようにyまたはzを返すことができるようにするためです。

// One of the two conditional values is now 0
int conditionalA = mask&y;
int conditionalB = ~mask&z;

// One of the values is combined with 0 using |
int out = conditionalA|conditionalB;

return out;

私がこのようなマスクを作ったところ:

// Make any x other than 0 all 1s
int mask = x;
mask |= mask>>1;
mask |= mask>>2;
mask |= mask>>4;
mask |= mask>>8;
mask |= mask>>16;

mask |= mask<<1;
mask |= mask<<2;
mask |= mask<<4;
mask |= mask<<8;
mask |= mask<<16;

すべての1または0をマスクするためのより良い方法があるはずですが、これ以上の効率的な解決策は考えられません。繰り返しますが、xが0の場合、0が0のままであることが重要です。

編集:ステートメントがオプションでない場合

4

3 に答える 3

6

2の補数を仮定すると:

int mask = !x + ~0;

!ゼロ以外の値を00にマップし、 ()1を追加してそれぞれを取得します。~0-1-10

于 2013-02-01T22:44:54.667 に答える
3

どうですか:

x = (x | -x) >> 31; // Note this is implementation specific.

-許可されていないものを使用しているので、ここでは正しい答えではありません。ノベルティとしてここに残しておきます。

于 2013-02-01T22:44:31.437 に答える
2

これが私が思う実用的なものです(2の補数演算を想定しています):

x = ~!!x + 1;

どうやってそこに着いたの?

まず、!!xゼロ以外の値を1に変換し、0は0のままです。次に、否定に2の補数の等価性を使用して-x = ~x + 1、presto!

于 2013-02-01T22:50:15.617 に答える