10

ビット単位のシフト演算子を使用しているときに、興味深いシナリオに出くわしました。2番目のオペランドが負の場合、ビット単位のシフト演算はどのように機能しますか?。

つまり、a << b、 "<<"は、ビットパターンをaのbビットだけ左にシフトします。しかし、bが否定的である場合、それは実行時のエラーではないでしょうか?

以下のコードを正常に実行できますが、どのように機能するのかわかりませんか?

 public static void bitwiseleftShift(char testChar)
{
    int val=testChar-'a';
    int result= 1<<val;
    System.out.println("bit wise shift of 1 with val="+val+" is "+result);
}

入力

   bitwiseleftShift('A');// ASCII 65
   bitwiseleftShift('0'); // ASCII 48 

結果

   bit wise shift of 1 with val=-32 is 1
   bit wise shift of 1 with val=-49 is 32768

'a'のASCIIは97です。誰かがこれがどのように機能するかを理解するのを手伝ってもらえますか?

4

1 に答える 1

9

しかし、bが否定的である場合、それは実行時のエラーではないでしょうか?

Java言語仕様、セクション15.19に準拠していません:

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

したがって、-32のシフトは実際には0のシフトになり、-49のシフトは実際には15のシフトになります-したがって、あなたが見た結果です。

于 2013-03-24T20:05:39.807 に答える