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吗?
答案 0 :(得分:4)
“奇怪的”移位结果的原因是,在移位之前,将这些值扩大到32位(int
)。
I。 e。 -38
不是这里的1101 1010
,而是1111 1111 1111 1111 1111 1111 1101 1010
。
应该清楚说明为什么-38 >>> 26
是0000 0000 0000 0000 0000 0000 0011 1111
(或63
)的原因。
在Java Language Specification中描述了加宽:
否则,如果操作数是编译时类型
byte
,short
或char
,则通过扩展原语将其提升为类型int
的值转换(第5.1.2节)。
如果您想对8位(byte
)值执行移位操作,则可以屏蔽该值以在扩展后但移位之前仅使用低8位,像费德里科建议的那样:
byte x = -38;
(x & 0xFF) >>> 26;
这将使期望值为0(尽管我不确定是否有意义,因为如果您右移8个以上,则任何8位值都将为0)。