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

时间:2016-10-19 20:39:19

标签: groovy bit-manipulation bit-shift

此代码:

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

这是否无法在字节上实现预期行为的逻辑右移?有没有解决办法,所以我可以在逻辑上右移一个字节?

更新也没有短暂的逻辑右移,但它确实适用于int

2 个答案:

答案 0 :(得分:1)

我还没有想到这一点,但尝试用0xff屏蔽它,操作本身应该是有效的,我认为你只是看到结果中超出一个字节的位。

编辑:好的,想一想。用0xff之前掩饰它(如果你的移动向另一个方向移动,可能之后),你应该得到你想要的结果。

以字节为单位,负值看起来像这样:

1111 1101

当java开始操作它时,它会将其转换为int。

1111 1111 1111 1101

转移为:

0111 1111 1111 1110

然后转换回一个字节:

1111 1110

(仍为负面)

掩蔽(&)

1111 1111 1111 1101

使用:

<00> 0000 0000 1111 1111

首先会给你一个类似

的int值 <00> 0000 0000 1111 1101

将转移到

<00> 0000 0000 0111 1110

给你

的字节值

0111 1110

(注意,我认为int的前面有1倍,就像我在这里说的那样,但概念是相同的。)

答案 1 :(得分:0)

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

相关问题