-1

誰かがそのようなタスクを解決する方法を説明してください?

int x = (Integer.MIN_VALUE << 1) >> 1;

そのような例を解決する方法を理解したいですか?サンプルに Integer.MIN_VALUE (Integer.MAX_VALUE) が含まれている場合はどうすればよいですか?

4

4 に答える 4

2

シフト演算子 ( y << x) は、 のビットをy左に 'x' 桁シフトするだけです。一番右のビットが になり0ます。演算子は>>右にシフトし、左端のビット (符号ビット) の値が新しい左端のビットにコピーされます。

答えを導き出すには、初期値 (Integer.MIN_VALUE) のビット パターンが必要であり、演算を行って結果のビット パターンを取得します。その後、それを 10 進数値に戻すことができます。

于 2013-10-28T22:25:44.767 に答える
2

さて、短いチュートリアルhttp://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.htmlに従うことができます

簡単に言えば、<<(左シフト) を実行することで、数値のバイナリ表現を左に移動します。
つまりx = 0b0010、 が にx << 1なると0b0100、新しい「ゼロ」ビットが右に追加されます。

同様に、右シフトの場合:がx = 0b1010x >> 1なると0b1101、右端のビットが消え、新しい「1」ビット (左端のビットの値に依存) が左側に追加されます。

パズルを解くには のバイナリ表現を見つける必要がありますがInteger.MIN_VALUE、これはそれほど難しいことではありません。

于 2013-10-28T22:32:36.430 に答える
1

最小値は として表され10000000000000000000000000000000ます。32 1 です。わかりやすくするために、4 ビットのみで作業しているとしましょう。この場合、 はMIN_INTになります1000。これは 32 ビットにも適用されます。

次に<<、1 だけ左にシフトします。これにより、すべてのビットが左に 1 桁シフトされます。したがって、1000になり0000ます。これは 2 倍するようなものです (ただし、この場合はオーバーフローします!)、

次に、'>>' を 1 だけ右にシフトします。これにより、すべてのビットが 1 桁右にシフトします。この場合、0000右シフトすると符号ビットが複製されるようになります。だ1111としたら1111。これは、符号ビットのコピーにうんざりしているに違いない場合を除いて、2 で除算するようなものです。

于 2013-10-28T22:36:54.270 に答える
1

ビット シフト演算子がどのように機能するかを理解しようとしている場合は、次の 2 つのことをお勧めします。

  • まず、彼らが何をするかについてのいくつかのガイドを読んでください: herehereなど。
  • いくつかのコードを書き、出力を見てください。Integer.MIN_VALUEそうすれば、ビット シフト演算子がや などの値に実際にどのように影響するかを確認できますInteger.MAX_VALUE
于 2013-10-28T22:27:02.473 に答える