逻辑和算术移位的输出

时间:2015-03-31 22:33:02

标签: java byte bit-shift

这是一个很小的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?

1 个答案:

答案 0 :(得分:4)

缺少的信息是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操作中的位和>>>

相关问题