3

私は自分自身にJavaを教えており、ThinkinginJavaの演習を行っています。

116ページの演習11では、整数をすべての2進位置で右シフトし、各位置をInteger.toBinaryStringで表示する必要があります。

public static void main(String[] args) {
int i = 8;
System.out.println(Integer.toBinaryString(i));
int maxIterations = Integer.toBinaryString(i).length();
int j;
for (j = 1; j < maxIterations; j++) {
    i >>= 1;
System.out.println(Integer.toBinaryString(i));
}

ソリューションガイドでは、出力は次のようになります。

1000
1100
1110
1111

このコードを実行すると、次のようになります。

1000
100
10
1

ここで何が起こっているのか。数字は途切れていますか?

jdk1.6.0_2064ビットを使用しています。この本はjdk1.532ビットを使用しています。

4

6 に答える 6

10

本に誤りがあるようです。

右シフト操作は、すべてのビットを右にシフトし、最下位ビットを削除します。これは、結果を正しく整列させる場合(たとえば、ゼロでパディングすることによって)、はるかに理にかなっています。

00001000
00000100
00000010
00000001
00000000

シフトインされた最上位ビットは次のとおりです。

  • あなたの数が正の場合は0
  • あなたの数が負の場合は1。

最終結果を1にしたい場合は、8ではなく-8のような負の数を使用してみてください。

11111111111111111111111111111000
11111111111111111111111111111100
11111111111111111111111111111110
11111111111111111111111111111111

>>>の代わりにを使用する>>と、数値が正か負かに関係なく、常にゼロがシフトインされます。

于 2010-06-09T16:38:09.690 に答える
3

入力として正の整数を指定すると、右シフト演算子が最終的にゼロを生成するのは正しいことです。

これは、すべての桁が右にシフトされ、右端の桁が切り取られ、左にゼロが追加される操作と考えるのが最適です。つまり、パターンは次のとおりです。

00001000
00000100
00000010
00000001
00000000
00000000
于 2010-06-09T16:39:04.947 に答える
3

ビット演算子Javaチュートリアルページから:

符号なし右シフト演算子">>>"はゼロを左端の位置にシフトしますが、">>"の後の左端の位置は符号拡張に依存します。

8は正なので、ゼロがシフトされます。が負の場合i、代わりに1がシフトされます(整数で同じ符号を維持するため)。

于 2010-06-09T16:40:22.967 に答える
2

右シフト演算子は、ビットを右に移動します。つまり、

01000
00100
00010
00001

右シフトは、左端のビットをシフト前と同じ値で「埋めます」。一番左のビットは符号なので、正の値はゼロで埋められ、負の値は 1 で埋められます。

于 2010-06-09T16:43:09.543 に答える
1

あなたがあなたのintに最も高いビットを設定した場合

int i = 1 << 31;

説明されている動作が表示され、シフト中も標識が保持されます。動作を説明するための例だったと思います。

10000000000000000000000000000000
11000000000000000000000000000000
11100000000000000000000000000000
11110000000000000000000000000000
11111000000000000000000000000000
11111100000000000000000000000000
11111110000000000000000000000000
....
11111111111111111111111111111000
11111111111111111111111111111100
11111111111111111111111111111110
11111111111111111111111111111111
于 2010-06-09T16:45:43.500 に答える
1

variable >>= 1変数に 1 をシフトすると考えているようです。1実際には、変数をシフトする回数を指定します符号付き数値は、最上位ビット位置にあるものにシフトします。 >>>数値を符号なしで動作させ、常にゼロをシフトさせます。

于 2010-06-09T17:14:30.357 に答える