此代码:
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
答案 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类型。