この質問は、Bitwise operations and shiftsの複製であり、ユーザーは同じコードを理解するよう求めます。残念ながら、私はそれをマークする評判はありません。
はのあなたが見つけソリューションとより詳細な説明に基づいていくつかの修正を加えて、Code-Apprentice's答えとAnT'sを繰り返すために、私自身の
move = 32 +(~n+1);
これは実際の32の差(Nの最大値、およびサイズですこの問題では整数)とn。
2つの補数符号付き整数を調べる理由を理解する。この形式では、方法1011はできない符号なし整数、例えば元の例では、5(0101)に-5ビットを反転し、いずれかの追加を介して、
~5 + 1 = -5
又は
~(0101) + 1 = 1011
注意を変換します3ビットに適合し、依然として負の数である(2の補数における負の数は、1で始まる必要があります)
よう
move = 32 +(~n+1);
は、最終行が1行にいくつかのアイデア
!(x^((x<<move)>>move));
はそれを分解することができます実際には、実際に
move = 32 - n;
です。
invert the truthiness of
(x xor a number)
where the number is x first shifted left then right amount move
and move is the difference between n and 32.
もう一度5と3の例を使用します。移動は32 -3となるはずなので、移動は29です。
なぜ、左右に同じ量だけシフトするのですか?通常、コード内でこれを行う人がいるときは、数値をゼロにしようとしています。この場合、作者はそれをしていませんが、署名を拡張します。例えば
下記をご覧:符号付き数が出始めた場合、著者は、RSHIFTの実装レベルの癖を使用している
given 0000 0000 0000 0000 0000 0000 0000 0101 = 5
5 << 29 = 1010 0000 0000 0000 0000 0000 0000 0000 = -1610612736
-1610612736 >> 29 = 1111 1111 1111 1111 1111 1111 1111 1101 = -3
、それはその符号と符号がそのよう数の残りの部分を埋め続けますシフト。
32ビット符号付き数値の最後に5をシフトしたときに1から始まったため、符号の埋め込み(5 >> 29)< < 29の結果は同じではありません。それ自体に署名した。
次の行をx ==番号場合
(x^number)
0 XOR 1 = 1、及び1つのXOR 1 = 0、及びそれによってだから0 XOR 0 = 0であるため、0になりはるかに簡単ですロジック、我々はxのtruthinessを反転するとき
x == (sign shifted x)
5の場合は、我々は単に最後の桁(1)を失うことになると私たちはその
を見つけるだろう(1000)の代わりに8、と言った場合、私たちがチェックしています
!(8^0) == false.
3 = 011なので実際に働いた数値(たとえば3)を使用し、3で29を右にシフトすると最初のビットが0になる場合は、前後にシフトすると3の値が保持され、私たちはただ、次の
given int x and int n,
check if x == (x shifted left then sign shifted right by (size of int in bits - n))
出典
2017-03-21 17:26:29
snb
ありがとうない、本当に機能を要約すると
を見つけるだろう!あなたは本当に私を助けました。 – HumbertZhang