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

blo*_*k69 3 java bit-shift bit

Decimal         Binary 

x1 = 105        0110 1001
x2 = -38        1101 1010  

1. (byte) (x>>2) 
2. (byte) (x>>>26)
Run Code Online (Sandbox Code Playgroud)

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

但我不知道为什么第二个班次会导致:0011 1111 或 63。

我的理解是,如果 x 为负,则 x >> 加 1,如果 x 为正,则加 0。无论符号如何,>>> 都会添加 0。因此,如果是这种情况,x2 >>> 26 的结果不是 0000 0000 吗?

har*_*ldK 5

“奇怪”位移结果的原因是因为在位移之前值被加宽到 32 位 ( int) 。

IE。-38不在1101 1010这里,但是1111 1111 1111 1111 1111 1111 1101 1010

这应该清楚为什么-38 >>> 260000 0000 0000 0000 0000 0000 0011 1111(或63)。

Java 语言规范中描述了扩展:

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


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

byte x = -38;
(x & 0xFF) >>> 26;
Run Code Online (Sandbox Code Playgroud)

这将给出 0 的预期值(尽管我不确定这是否有意义,因为如果右移超过 8 位,任何 8 位值都将为 0)。