8

なぜ

int x = -1 // binary: 11111111111111111111111111111111
x = x >>> 31; 

00000000000000000000000000000001があります

しかし、

int x = -1
x = x >>> 32;

11111111111111111111111111111111(再び-1)

しかし、000000000000000000000000000000000000ではありませんか?

4

3 に答える 3

13

JLSのセクション15.19から:

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

強調鉱山。それで:

x >>> n

と同等です:

x >>> n & 0x1f  // or x >>> n % 32

したがって、<==> ==x >>> 32と同等です。x >>> 32 & 0x1fx >>> 0x

したがって、経験則で32は、 (intis )の倍数だけ数値をシフトすると32 bits、同じ値が返されます。

于 2013-02-11T17:39:02.023 に答える
2

ビットシフト演算を適用する場合、右側のオペランドの下位5ビットのみが考慮されます。32 === 0 // mod 32なので、結果はシフトしません。

于 2013-02-11T17:39:20.997 に答える
0

長いl=i << 32が奇妙に動作する理由について頭を悩ませて一日を過ごし、いくつかの基本的なテストを作成し、WTFの瞬間があり、それが機能するように長いl =(long)i<<32に変更しました。

Rohitの答えに私の唯一の追加は、これがそうなの理由です。IA-32インテルアーキテクチャソフトウェア開発者マニュアル3から:

8086はシフトカウントをマスクしません。ただし、他のすべてのIA-32プロセッサ(Intel 286プロセッサ以降)は、シフトカウントを5ビットにマスクし、最大カウントは31になります。このマスキングは、すべての動作モード(仮想8086モードを含む)で実行されます。命令の最大実行時間を短縮します

于 2017-06-16T23:20:11.763 に答える