1

次のコードが与えられます:

public class Something {
public static void main(String[] args) {
    int num = 1;

    num <<= 32;
    System.out.println(num); 

    num = 1;
    for (int i = 0 ; i < 32; i++)
        num <<= 1;
    System.out.println(num);
}
}

最初の出力(num << = 32から)は1です。

(forループからの)2番目の出力は0です。

わかりません。私には同じように見えます。どちらの方法でも「1」桁(lsb)が32回シフトし、結果が異なります。

誰か説明できますか?

前もって感謝します。

4

2 に答える 2

5

誰か説明できますか?

絶対。基本的に、のシフト演算でintは、[0、31]の範囲の値を取得するために右オペランドがマスクされます。のシフト操作でlongは、[0、63]の範囲の値を取得するためにマスクされています。

それで:

num <<= 32;

と同等です:

num <<= 0;

JLSのセクション15.19から:

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

于 2013-03-18T19:17:47.240 に答える
0

のビットシフト演算子intの場合、最下位5ビットのみが使用されます。だから<< 32何もしません。<< 032の最後の5ビットが0であるため、これはと同等です。ただし<< 1、ループ内の操作はそれぞれ期待どおりに実行されます。

于 2013-03-18T19:18:35.717 に答える