有人可以解释一下此位操作吗?

时间:2019-02-21 15:41:50

标签: java bit bit-shift

Decimal         Binary 

x1 = 105        0110 1001
x2 = -38        1101 1010  

1. (byte) (x>>2) 
2. (byte) (x>>>26)

我知道第一个移位会将其向右移位两次,并用1替换丢失的位,因此移位结果为: 1111 0110

但我不知道为什么第二轮转换会导致: 0011 1111或63。

我的理解是,如果x为负,则x >>加1;如果x为正,则x加0。 >>>加上0而不考虑符号。那么如果是这样,x2 >>> 26的结果就不会是0000 0000吗?

1 个答案:

答案 0 :(得分:4)

“奇怪的”移位结果的原因是,在移位之前,将这些值扩大到32位(int)。

I。 e。 -38不是这里的1101 1010,而是1111 1111 1111 1111 1111 1111 1101 1010

应该清楚说明为什么-38 >>> 260000 0000 0000 0000 0000 0000 0011 1111(或63)的原因。

Java Language Specification中描述了加宽:

  

否则,如果操作数是编译时类型byteshortchar,则通过扩展原语将其提升为类型int的值转换(第5.1.2节)。


如果您想对8位(byte)值执行移位操作,则可以屏蔽该值以在扩展后但移位之前仅使用低8位,像费德里科建议的那样:

byte x = -38;
(x & 0xFF) >>> 26;

这将使期望值为0(尽管我不确定是否有意义,因为如果您右移8个以上,则任何8位值都将为0)。