13

~ & ^ | + << >>私が使用できる唯一の操作です

続ける前に、これは宿題の質問です、私はこれに本当に長い間立ち往生しています。

私の元々のアプローチ:!xは2の補数で実行でき、反数で何かを実行できると思いました。xorがおそらくここにあることは知っていますが、これにアプローチする方法が本当に途方に暮れています。

記録のために:私は条件、ループ==なども使用できず、上記の関数(ビット単位)のみを使用できます。

例えば:

!0 = 1
!1 = 0
!anything besides 0 = 0
4

6 に答える 6

9

32 ビットの unsigned int を想定すると、次のようになります。

(((x>>1) | (x&1)) + ~0U) >> 31

トリックを行う必要があります

于 2011-02-11T16:53:32.113 に答える
8

が署名されていると仮定するxと、ゼロ以外の数値に対しては 0 を返し、ゼロに対しては 1 を返す必要があります。

符号付き整数の右シフトは、通常、ほとんどの実装では算術シフトです (たとえば、符号ビットがコピーされます)。したがって、31 だけ右にシフトxし、31 だけ否定します。これら 2 つのうちの 1 つは負の数になるため、31 だけ右にシフトすると 0xFFFFFFFF になります (もちろん、x = 0 の場合、右にシフトすると 0x0 が生成されます)。x またはその否定が負の数であるかどうかがわからないので、それらを一緒に「or」すると、必要なものが得られます。次に 1 とあなたの良いを追加します。

実装:

int bang(int x) {
    return ((x >> 31) | ((~x + 1) >> 31)) + 1;
}
于 2015-02-04T03:17:46.933 に答える
1

32ビット符号付き整数xの場合

// Set the bottom bit if any bit set.
x |= x >> 1;
x |= x >> 2;
x |= x >> 4;
x |= x >> 8;
x |= x >> 16;

x ^= 1;   // Toggle the bottom bit - now 0 if any bit set.
x &= 1;   // Clear the unwanted bits to leave 0 or 1.
于 2011-02-11T19:30:48.857 に答える
1

次のコードは、任意の 1 ビットをすべての位置にコピーします。これは、すべての非ゼロを にマップし0xFFFFFFFF == -1、 のままに00ます。次に、とにマッピング-1して1 を追加します。001

x = x | x << 1  | x >> 1
x = x | x << 2  | x >> 2
x = x | x << 4  | x >> 4
x = x | x << 8  | x >> 8
x = x | x << 16 | x >> 16

x = x + 1
于 2011-02-06T09:23:22.843 に答える
0

たとえば、8 ビットの符号なしタイプを想定すると、次のようになります。

~(((x >> 0) & 1)
| ((x >> 1) & 1) 
| ((x >> 2) & 1)
...
| ((x >> 7) & 1)) & 1
于 2011-01-21T23:40:16.290 に答える
-3

〜x&1を実行できます。これは、0の場合は1、その他の場合は0になるためです。

于 2011-02-11T16:20:03.213 に答える