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 吗?
“奇怪”位移结果的原因是因为在位移之前值被加宽到 32 位 ( int) 。
IE。-38不在1101 1010这里,但是1111 1111 1111 1111 1111 1111 1101 1010。
这应该清楚为什么-38 >>> 26是0000 0000 0000 0000 0000 0000 0011 1111(或63)。
Java 语言规范中描述了扩展:
否则,如果操作数是编译时类型
byte、short、 或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)。