8

为什么如果

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

我们有 000000000000000000000000000000001

但如果

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

我们有 11111111111111111111111111111111(再次-1)

但不是 00000000000000000000000000000000 吗?

4

3 回答 3

13

JLS 的第 15.19 节

如果左侧操作数的提升类型是 int,则只有右侧操作数的五个最低位用作移位距离。就好像右手操作数&使用掩码值进行按位逻辑与运算符(第 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是,每当你将一个数字移动( intis )的倍数时32 bits,你会得到相同的值。

于 2013-02-11T17:39:02.023 回答
2

应用移位操作时,仅考虑右手操作数的最低 5 位。由于 32 === 0 // mod 32,结果是没有移位。

于 2013-02-11T17:39:20.997 回答
0

花了一整天的时间来思考为什么 long l = i << 32 表现得很奇怪,然后写了一些基本的测试,有 WTF 时刻,然后改成 long l = (long) i << 32 让它工作。

我对 Rohit 回答的唯一补充就是为什么会这样。来自 IA-32 英特尔架构软件开发人员手册 3:

8086 不屏蔽移位计数。但是,所有其他 IA-32 处理器(从 Intel 286 处理器开始)都会将移位计数屏蔽为 5 位,从而导致最大计数为 31。此屏蔽在所有操作模式(包括虚拟 8086 模式)中完成以减少指令的最大执行时间

于 2017-06-16T23:20:11.763 回答