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

问题描述 投票:3回答:1
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吗?

java bit bit-shift
1个回答
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,则通过扩展原语转换(第5.1.2节)将其提升为类型int的值。


如果你想在8位(byte)值上执行位移操作,你可以屏蔽该值,在加宽之后但在移位之前仅使用低8位,就像Federico建议的那样:

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

这将给出预期值0(虽然我不确定它是否有意义,因为如果右移8次以上任何8位值将为0)。

© www.soinside.com 2019 - 2024. All rights reserved.