java位操作>>>移位
为什么如果
int x = -1 // binary: 11111111111111111111111111111111 x = x >>> 31;
我们有00000000000000000000000000000001
但如果
int x = -1 x = x >>> 32;
我们有11111111111111111111111111111111(再次-1)
但不是00000000000000000000000000000000?
从JLS的第15.19节 :
如果左侧操作数的提升类型是int,则只使用右侧操作数的五个最低位作为移位距离 。 就好像右手操作数受到按位逻辑AND运算符
&
(§15.22.1)和掩码值0x1f (0b11111)
。 因此,实际使用的移位距离始终在0 to 31
的范围内,包括0 to 31
。
强调我的。 所以:
x >>> n
相当于:
x >>> n & 0x1f // or x >>> n % 32
所以, x >>> 32
相当于x >>> 32 & 0x1f
<==> x >>> 0
== x
。
因此,经验法则是,每当您将数字移动32
的倍数( int
为32 bits
)时,您将获得相同的值。
当应用位移操作时,仅考虑右手操作数的最低5位。 由于32 === 0 // mod 32,结果是没有移位。
花了整整一天时间为什么长时间l = i << 32表现得很奇怪,然后写了一些基本测试,有了WTF时刻,然后长时间l =(长)i << 32让它工作。
我唯一补充Rohit的答案就是为什么会这样。 来自IA-32英特尔架构软件开发人员手册3:
8086不掩盖class次计数。 但是,所有其他IA-32处理器(从Intel 286处理器开始)确实将移位计数屏蔽为5位,最大计数为31.此屏蔽在所有操作模式(包括虚拟8086模式)下完成减少指令的最大执行时间