2

私は、Jay Bryant 著の Java 7 for Absolute Beginners という本から Java を学んでいました。164 ページには、次のような特定の方法を使用して、テキスト ファイルの内容を読み取ってから反転した特定の例がありました。

private static void reverseByteArray(byte[] inBytes) {
    int inLength = inBytes.length;
    for (int i = 0; i < (inLength >>1); i++) {
        byte temp = inBytes[i];
        inBytes[i] = inBytes[inLength - i - 1];
        inBytes[inLength - i - 1] = temp;
    }
}

私の質問は、ビットごとのシフト演算子が次の行で何をするかです for (int i = 0; i < (inLength >>1) ; i++) {

-テキストの内容を逆にする操作全体での役割は何ですか?

最初のバイトの値を最後のバイトの値と交換する for ループの下の後続のコードを理解していると思います。

ビットごとのシフト演算子が存在しない場合、出力は反転されません。

イニシャル: 眠る: 夢を見る可能性: ええ、摩擦があります。その死の眠りの中で、どんな夢が現れるかもしれないこの死すべきコイルを切り落としたとき、私たちに一時停止を与えなければならない:長い人生の災難をもたらす尊敬がある

出力: efil gnol os fo ytimalac sekam tahT tcepser eht s'ereht :esuap su evig tsuM ,lioc latrom siht ffo delffuhs evah ew nehW emoc yam smaerd tahw htaed fo Peles taht ni roF ;bur eht s'ereht ,ya :maerd ot ecnahcrep :ピール oT

ありがとうございました。

4

4 に答える 4

4

ビットごとのシフト演算子は次の行で何をしますか

配列を反転するには、半分の長さになるまで反復するだけです。それが、ビット シフト演算子が行っていることです。1 だけビット シフトすると、最後のビットが切り捨てられ、2 で除算することと同じです。

length >> 1  == length / 2

ビットごとのシフト演算子が存在しない場合、出力は反転されません

until を繰り返しlength、次にuntil を繰り返すlength / 2と、各要素は最後から対応する要素と交換されます。しかし、そこからさらに先に進むと、要素が左に向かうように、要素の交換が開始されます。したがって、最終的な配列は元の配列と同じになります。

次の簡単な例を考えてみましょう。 arr = [1, 2, 3, 4, 5]

  • index から開始し0、 でスワップarr[0]するとarr[4]、配列は次のようになります。

    [5, 2, 3, 4, 1]
    
  • index = 1arr[1]、と交換arr[3]:

    [5, 4, 3, 2, 1]
    

ここまではすべて問題なく、長さの半分まで反復するだけです。さらに進むと、次のようになります。

  • index = 2、スワップarr[2]およびarr[2]、変化なし

  • index = 3、スワップarr[3]、およびarr[1]:

    [5, 2, 3, 4, 1]
    

アレイが前の状態に変化し始めるのを見てください。

于 2013-08-10T07:30:23.277 に答える
1

int を 1 だけ右にシフトすることは、そのバイナリ表現を右側から 1 桁だけ切り捨てることと同じです。これは明らかに、整数を 2 で除算することと同じです。(これは、短いプログラムでテストするか、バイナリ 101 >> 1 == バイナリ 10 などを観察することによってテストできます)

次に、この for ループのテスト ステップは、i を inLength/2 と比較します。いつものように、inlength は、こ​​の演算子を適用しても変更されません (5+4 が値を変更しないのと同様に、演算子は引数を変更せずに結果を返します)。 5または4の)

このテストの役割は、単純にループを制限することです。つまり、文字列の半分を反復処理します。

于 2013-08-10T07:33:13.960 に答える
0

>>は、移動ごとに値を効果的に半分にする符号付き右シフト演算子です。
<<は、値を効果的に 2 倍にする左シフト演算子です。
>>>MSB を常に 0 で埋める符号なし右シフト演算子です。

于 2013-08-11T02:08:12.190 に答える
0
(inLength >> 1) == (int) inLength / 2
于 2013-08-10T07:40:05.847 に答える