java位操作>>>转移

时间:2013-02-11 17:37:32

标签: java int bits operation

为什么

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

我们有00000000000000000000000000000001

但是如果

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

我们有11111111111111111111111111111111(再次-1)

但不是00000000000000000000000000000000?

3 个答案:

答案 0 :(得分:13)

来自Section 15.19 of JLS

  

如果左侧操作数的提升类型为int,则只有五   右侧操作数的最低位用作移位   距离即可。好像右手操作数受到了a   具有掩码值&的按位逻辑AND运算符0x1f (0b11111)(第15.22.1节)。因此实际使用的换档距离总是在   范围0 to 31,包括在内。

强调我的。所以:

x >>> n

相当于:

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

因此,x >>> 32相当于x >>> 32 & 0x1f< ==> x >>> 0 == x

所以经验法则是,每当您将一个数字移动32 int 的倍数为32 bits时),你得到相同的价值。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

花了整整一天时间,为什么长期l = i<< 32表现奇怪,然后写了一些基本测试,有WTF时刻,然后变成长l =(长)i<< 32它的工作。

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

  

8086不会掩盖班次计数。但是,所有其他IA-32处理器(从Intel 286处理器开始)确实将移位计数屏蔽为5位,最大计数为31.此屏蔽在所有操作模式(包括虚拟8086模式)下完成减少指令的最长执行时间