2016-07-22 5 views
-4

論理右シフトと左シフトを実行しようとしています(>>>と< <を使用しています)。残念ながら、シフト量が32より大きい場合は、モジュロでビットを回転させ、ビットを適切な位置にシフトすることがすべてわかります。それは本当にそれらをシフトさせるだけではありません。どうすればそれを避けることができますか? centOSでJava 7を使用します。 更新:Javaでのシフト結果が悪い

public static void main(String[] args) { 
    int a = 0xc0000003; 
    int b = a >>> 32; 
    int c = 0xc0000003; 
    int d = c << 36; 
    System.out.println("b=" + b + ", d=" + d); 
} 

出力はb=-1073741821, d=48です: 私はバグがあると思い例で遊んでました。どうして?どのように私はcのように右と左のロジックをシフトするのですか?

+2

「[ビットシフト演算子](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html)」と呼ばれています。彼らは* shift *、回転*しません。あなたはどこで回転するのか考えましたか? – Andreas

+0

問題を示す[mcve]を入力してください。 –

+2

20年以上も前の言語に比べて、あなたは何をしているのか分かりません。 – eldo

答えて

0

Javaでは、それは右手値によって満杯シフトではありませんが、これが答えです:

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

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

The Java® Language Specificationから取得。私にとっては、この動作はあまり直感的ではありません...

関連する問題