3

私はそれを正しく理解していないというこの小さな論理に固執しています

intは 32 ビットなので、20 をバイナリで取ると次のようになるとします。

// 00000000000000000000000000010100    

..今、右シフト操作を実行すると、4と言います

int a = 20>>4;   
// 00000000000000000000000000000001    

..だから結果は1

ここで、再び 20 を取り、5 つの右シフト演算を行うとします。

int b = 20>>5;  //00000000000000000000000000000000    

..だから結果は0

ここで 32 右シフトを行うと、割り当てた番号と同じ番号が返されるのはなぜですか??

int c = 20>>32; //how does this prints 20 again??

System.out.println("right shift 4= "+a+"\n right shift 5= "+b+"right shift 32 = "+c);

だから私が期待していたのは、5シフト後です..任意の数のシフトで結果が0になるはずですが、32シフトで割り当てられた値が返されるのはなぜですか?

4

2 に答える 2

7

シフトするintと、シフトの下位 5 ビットのみが使用されます。a をシフトするとlong、下位 6 ビットのみが使用されます。

Java 言語仕様セクション 15.19から:

左側のオペランドの昇格された型が int の場合、右側のオペランドの下位 5 ビットのみがシフト距離として使用されます。これは、右側のオペランドがマスク値 0x1f (0b11111) を使用してビットごとの論理 AND 演算子 & (§15.22.1) にかけられたかのようです。したがって、実際に使用されるシフト距離は、常に 0 ~ 31 の範囲内です。

左側のオペランドの昇格された型が long の場合、右側のオペランドの下位 6 ビットのみがシフト距離として使用されます。これは、右側のオペランドがマスク値 0x3f (0b111111) を使用してビットごとの論理 AND 演算子 & (§15.22.1) にかけられたかのようです。したがって、実際に使用されるシフト距離は、常に 0 から 63 までの範囲になります。

于 2014-03-08T09:05:45.503 に答える