为什么如果
int x = -1 // binary: 11111111111111111111111111111111
x = x >>> 31;
我们有 000000000000000000000000000000001
但如果
int x = -1
x = x >>> 32;
我们有 11111111111111111111111111111111(再次-1)
但不是 00000000000000000000000000000000 吗?
如果左侧操作数的提升类型是 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
是,每当你将一个数字移动( int
is )的倍数时32 bits
,你会得到相同的值。
应用移位操作时,仅考虑右手操作数的最低 5 位。由于 32 === 0 // mod 32,结果是没有移位。
花了一整天的时间来思考为什么 long l = i << 32 表现得很奇怪,然后写了一些基本的测试,有 WTF 时刻,然后改成 long l = (long) i << 32 让它工作。
我对 Rohit 回答的唯一补充就是为什么会这样。来自 IA-32 英特尔架构软件开发人员手册 3:
8086 不屏蔽移位计数。但是,所有其他 IA-32 处理器(从 Intel 286 处理器开始)都会将移位计数屏蔽为 5 位,从而导致最大计数为 31。此屏蔽在所有操作模式(包括虚拟 8086 模式)中完成以减少指令的最大执行时间