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为正,则加0。 >>>无论符号如何都添加0。那么,如果是这种情况,x2 >>> 26的结果不会是0000 0000吗?
“奇怪”位移位结果的原因是因为值在移位之前被加宽到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
,则通过扩展原语转换(第5.1.2节)将其提升为类型int
的值。
如果你想在8位(byte
)值上执行位移操作,你可以屏蔽该值,在加宽之后但在移位之前仅使用低8位,就像Federico建议的那样:
byte x = -38;
(x & 0xFF) >>> 26;
这将给出预期值0(虽然我不确定它是否有意义,因为如果右移8次以上任何8位值将为0)。