gpt4 book ai didi

java - 逻辑和算术移位的输出

转载 作者:行者123 更新时间:2023-12-01 18:16:11 25 4
gpt4 key购买 nike

这是一个小型的 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。负 2 也可以。

逻辑移位应该在左侧添加零。 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 - 逻辑和算术移位的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29379734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com