4

Javaのシフト演算子に問題があります。次のコードを使用しましたが、このプログラムがこの出力を生成する方法を理解できません。このプログラムがこの出力を生成する方法を教えてください。

public class Operator {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int s = 8;
        s = s >>-63;
        System.out.println("value of i=" + s);
    }

}

出力: i=4の値

4

5 に答える 5

17

JLSのセクション15.19(シフト演算子)から:

左側のオペランドのプロモートされたタイプがintの場合、右側のオペランドの下位5ビットのみがシフト距離として使用されます。これは、右側のオペランドに、マスク値0x1f(0b11111)を使用したビット単位の論理AND演算子&(§15.22.1)が適用されたかのようです。したがって、実際に使用されるシフト距離は、常に0〜31の範囲になります。

さて-63 & 0x1f == 1、これは実際には右に1シフトしているので、4の答えになります。

于 2012-05-09T13:10:14.893 に答える
4

s = s >>-63;s = s >> 1;(-63%32)のようなものです

JLS§15.19でシフト演算子の動作を見てください。

于 2012-05-09T13:10:07.877 に答える
0

次の 2 つのステートメントは、負のシフトを置き換えたい場合、整数に対してまったく同じ結果を生成します。

r << -shift

r << ((32 - shift) % 32)

(32 は Java の整数のサイズです)

于 2013-10-31T09:36:40.553 に答える