Groovy 逻辑右移字节 - 错误或功能

Groovy logical shift right on byte - bug or feature

此代码:

def x = -128
def y = x >> 1
def z = x >>> 1
println "x is $x y is $y and z is $z"

正如我所期望的那样工作:

x is -128 y is -64 and z is 2147483584

而这段代码:

byte x = -128
byte y = x >> 1
byte z = x >>> 1
println "x is $x y is $y and z is $z"

没有:

x is -128 y is -64 and z is -64

未能在字节上实现逻辑右移是预期的行为吗?是否有解决方法,以便我可以在逻辑上右移一个字节?

Update short 也没有逻辑右移,但它确实适用于 int

与 Java 一样,byte 和 short 在移位发生之前被提升为带有符号扩展的 int 类型。

我还没有想清楚,但尝试用 0xff 屏蔽它,操作本身应该是有效的,我想你只是看到了结果中一个字节之外的位。

编辑:好的,想通了。之前用 0xff 屏蔽它(如果你的班次朝另一个方向移动,可能之后)你应该得到你想要的结果。

以字节为单位,负值将如下所示:

1111 1101

当java开始对其进行操作时,它将把它转换为一个整数。

1111 1111 1111 1101

变化为:

0111 1111 1111 1110

然后转换回一个字节:

1111 1110

(还是负值)

屏蔽 (&)

1111 1111 1111 1101

有:

0000 0000 1111 1111

首先会给你一个 int 值,比如

0000 0000 1111 1101

将转移到

0000 0000 0111 1110

给你字节值

0111 1110

(注意,我认为 int 前面的 1 的数量是我在这里所说的两倍,但概念是相同的。)