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 的数量是我在这里所说的两倍,但概念是相同的。)
此代码:
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 的数量是我在这里所说的两倍,但概念是相同的。)