なぜ
int x = -1 // binary: 11111111111111111111111111111111
x = x >>> 31;
00000000000000000000000000000001があります
しかし、
int x = -1
x = x >>> 32;
11111111111111111111111111111111(再び-1)
しかし、000000000000000000000000000000000000ではありませんか?
左側のオペランドのプロモートされたタイプがintの場合、右側のオペランドの下位5ビットのみがシフト距離として使用されます。これは、右側のオペランドが
&
マスク値を使用してビット単位の論理AND演算子(§15.22.1)を受けた場合と同じです0x1f (0b11111)
。したがって、実際に使用されるシフト距離は、常に範囲内にあります0 to 31
。
強調鉱山。それで:
x >>> n
と同等です:
x >>> n & 0x1f // or x >>> n % 32
したがって、<==> ==x >>> 32
と同等です。x >>> 32 & 0x1f
x >>> 0
x
したがって、経験則で32
は、 (int
is )の倍数だけ数値をシフトすると32 bits
、同じ値が返されます。
ビットシフト演算を適用する場合、右側のオペランドの下位5ビットのみが考慮されます。32 === 0 // mod 32なので、結果はシフトしません。
長いl=i << 32が奇妙に動作する理由について頭を悩ませて一日を過ごし、いくつかの基本的なテストを作成し、WTFの瞬間があり、それが機能するように長いl =(long)i<<32に変更しました。
Rohitの答えに私の唯一の追加は、これがそうなの理由です。IA-32インテルアーキテクチャソフトウェア開発者マニュアル3から:
8086はシフトカウントをマスクしません。ただし、他のすべてのIA-32プロセッサ(Intel 286プロセッサ以降)は、シフトカウントを5ビットにマスクし、最大カウントは31になります。このマスキングは、すべての動作モード(仮想8086モードを含む)で実行されます。命令の最大実行時間を短縮します