誰かがそのようなタスクを解決する方法を説明してください?
int x = (Integer.MIN_VALUE << 1) >> 1;
そのような例を解決する方法を理解したいですか?サンプルに Integer.MIN_VALUE (Integer.MAX_VALUE) が含まれている場合はどうすればよいですか?
シフト演算子 ( y << x
) は、 のビットをy
左に 'x' 桁シフトするだけです。一番右のビットが になり0
ます。演算子は>>
右にシフトし、左端のビット (符号ビット) の値が新しい左端のビットにコピーされます。
答えを導き出すには、初期値 (Integer.MIN_VALUE) のビット パターンが必要であり、演算を行って結果のビット パターンを取得します。その後、それを 10 進数値に戻すことができます。
さて、短いチュートリアルhttp://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.htmlに従うことができます
簡単に言えば、<<
(左シフト) を実行することで、数値のバイナリ表現を左に移動します。
つまりx = 0b0010
、 が にx << 1
なると0b0100
、新しい「ゼロ」ビットが右に追加されます。
同様に、右シフトの場合:がx = 0b1010
にx >> 1
なると0b1101
、右端のビットが消え、新しい「1」ビット (左端のビットの値に依存) が左側に追加されます。
パズルを解くには のバイナリ表現を見つける必要がありますがInteger.MIN_VALUE
、これはそれほど難しいことではありません。
最小値は として表され10000000000000000000000000000000
ます。32 1 です。わかりやすくするために、4 ビットのみで作業しているとしましょう。この場合、 はMIN_INT
になります1000
。これは 32 ビットにも適用されます。
次に<<
、1 だけ左にシフトします。これにより、すべてのビットが左に 1 桁シフトされます。したがって、1000
になり0000
ます。これは 2 倍するようなものです (ただし、この場合はオーバーフローします!)、
次に、'>>' を 1 だけ右にシフトします。これにより、すべてのビットが 1 桁右にシフトします。この場合、0000
右シフトすると符号ビットが複製されるようになります。だ1111
としたら1111
。これは、符号ビットのコピーにうんざりしているに違いない場合を除いて、2 で除算するようなものです。