为什么
int x = -1 // binary: 11111111111111111111111111111111
x = x >>> 31;
我们有00000000000000000000000000000001
但是如果
int x = -1
x = x >>> 32;
我们有11111111111111111111111111111111(再次-1)
但不是00000000000000000000000000000000?
答案 0 :(得分:13)
如果左侧操作数的提升类型为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模式)下完成减少指令的最长执行时间