逻辑和算术移位的输出
Logical and Arithmetic shift's output
这是一个小 java 程序
public class otherclass {
public static void main(String[]args){
byte a=-5;
byte d= (byte) (a>>>1);
System.out.println(d);
byte e= (byte) (a>>>2);
System.out.println(e);
byte f= (byte) (a>>1);
System.out.println(f);
byte g= (byte) (a>>2);
System.out.println(g);
}
}
输出:
-3
-2
-3
-2
后两个输出(逻辑移位的-3和-2)我明白了。
负5是11111011
算术移位向右移动,左边额外增加的位就像MSB。所以一次移位使 11111101
为负 3。负二也可以。
逻辑移位应该在左边加零。 11111011
应该变成01111101
也就是125,怎么也输出负数3呢?
缺少的信息是 Java 在对值进行位移时将值提升为 int
,称为二进制数字提升。 byte
值在移位之前被提升为 int
,然后发生移位,然后它们被转换回 byte
。
-5 as byte : 11111011
-5 as int : 11111111 11111111 11111111 11111011
Bit shifted : 01111111 11111111 11111111 11111101
零被移入,但是返回到 byte
的转换会丢弃除最后 8 位之外的所有内容。
Cast to byte: 11111101 (-3)
如果您希望 >>>
操作表现得好像没有二进制数字提升,那么您必须屏蔽掉提升后的 int
.
的最后 8 位
byte d= (byte) ((a & 0xFF)>>>1);
System.out.println(d);
byte e= (byte) ((a & 0xFF)>>>2);
System.out.println(e);
输出:
125
62
这里发生了什么:
-5 as byte : 11111011
-5 as int : 11111111 11111111 11111111 11111011
Bit masked : 00000000 00000000 00000000 11111011
Bit shifted : 00000000 00000000 00000000 01111101
零像以前一样被移入,但转换回 byte
时除了最后 8 位外,其他都被丢弃了。
Cast to byte: 01111101 (125)
请注意,这会发生在 >>>
和 >>
中,因此仅在 >>>
操作中使用 0xFF
执行位与。
这是一个小 java 程序
public class otherclass {
public static void main(String[]args){
byte a=-5;
byte d= (byte) (a>>>1);
System.out.println(d);
byte e= (byte) (a>>>2);
System.out.println(e);
byte f= (byte) (a>>1);
System.out.println(f);
byte g= (byte) (a>>2);
System.out.println(g);
}
}
输出:
-3
-2
-3
-2
后两个输出(逻辑移位的-3和-2)我明白了。
负5是11111011
算术移位向右移动,左边额外增加的位就像MSB。所以一次移位使 11111101
为负 3。负二也可以。
逻辑移位应该在左边加零。 11111011
应该变成01111101
也就是125,怎么也输出负数3呢?
缺少的信息是 Java 在对值进行位移时将值提升为 int
,称为二进制数字提升。 byte
值在移位之前被提升为 int
,然后发生移位,然后它们被转换回 byte
。
-5 as byte : 11111011
-5 as int : 11111111 11111111 11111111 11111011
Bit shifted : 01111111 11111111 11111111 11111101
零被移入,但是返回到 byte
的转换会丢弃除最后 8 位之外的所有内容。
Cast to byte: 11111101 (-3)
如果您希望 >>>
操作表现得好像没有二进制数字提升,那么您必须屏蔽掉提升后的 int
.
byte d= (byte) ((a & 0xFF)>>>1);
System.out.println(d);
byte e= (byte) ((a & 0xFF)>>>2);
System.out.println(e);
输出:
125
62
这里发生了什么:
-5 as byte : 11111011
-5 as int : 11111111 11111111 11111111 11111011
Bit masked : 00000000 00000000 00000000 11111011
Bit shifted : 00000000 00000000 00000000 01111101
零像以前一样被移入,但转换回 byte
时除了最后 8 位外,其他都被丢弃了。
Cast to byte: 01111101 (125)
请注意,这会发生在 >>>
和 >>
中,因此仅在 >>>
操作中使用 0xFF
执行位与。