Java 逻辑和算术移位';s输出

Java 逻辑和算术移位';s输出,java,byte,bit-shift,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);

这里有一个小小的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为
11111 011

算术移位移到右边,左边额外添加的位类似于MSB。因此,一次移位使
11111101
为负3。负二也可以


逻辑移位应该在左边加零<代码>11111 011应变为
011111101
,即125。它是如何输出负3的?

缺少的信息是,当对值进行位移位时,Java将值提升为
int
,称为二进制数字提升。
byte
值在移位之前被提升为
int
,然后移位发生,然后被转换回
byte

-5 as byte  : 11111011
-5 as int   : 11111111 11111111 11111111 11111011
Bit shifted : 01111111 11111111 11111111 11111101
零被移入,但返回到
字节
时,除了最后的8位之外,其余都会丢弃

Cast to byte: 11111101 (-3)
Cast to byte: 01111101 (125)
如果希望
>>
操作表现为没有二进制数字升级,则必须屏蔽升级的
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
零和以前一样被移入,但是返回到
字节的转换将丢弃所有的零,但最后的8位除外

Cast to byte: 11111101 (-3)
Cast to byte: 01111101 (125)

请注意,
>>
>
都会出现这种情况,因此只有位和
>>
操作上的
>0xFF
才会出现这种情况。

缺少的信息是,Java在位移位时将值提升为
int
,称为二进制数字提升。
byte
值在移位之前被提升为
int
,然后移位发生,然后被转换回
byte

-5 as byte  : 11111011
-5 as int   : 11111111 11111111 11111111 11111011
Bit shifted : 01111111 11111111 11111111 11111101
零被移入,但返回到
字节
时,除了最后的8位之外,其余都会丢弃

Cast to byte: 11111101 (-3)
Cast to byte: 01111101 (125)
如果希望
>>
操作表现为没有二进制数字升级,则必须屏蔽升级的
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
零和以前一样被移入,但是返回到
字节的转换将丢弃所有的零,但最后的8位除外

Cast to byte: 11111101 (-3)
Cast to byte: 01111101 (125)

请注意,这将在
>>
>
中发生,因此仅在
>>
操作中使用位和
0xFF

请注意,移位发生在
int
类型(4字节)的值上。嗯,你是什么意思?它对字节变量不起作用?它是一种整数类型,由特定的字节数表示,字节数由哪种类型决定。例如,
int
有32个字节
short
是16个字节,
byte
是8个字节。我也不理解@SotiriosDelimanolis的评论,尽管注意到移位发生在
int
(4字节)类型的值上。嗯,你是什么意思?它对字节变量不起作用?它是一种整数类型,由特定的字节数表示,字节数由哪种类型决定。例如,
int
有32个字节
short
是16个字节,
byte
是8个字节。我也不明白@SotiriosDelimanolis的评论,尽管我看到了。这就回答了问题。谢谢你。但现在我需要知道一种方法,在不让java做这种推广的情况下实现这种转变。我想按原样对字节进行移位。非常好的解释!呵呵,好吧。我明白你说的,只是这是我第一次遇到“掩蔽”。我想我需要先了解一下。。。非常感谢你:我明白了。这就回答了问题。谢谢你。但现在我需要知道一种方法,在不让java做这种推广的情况下实现这种转变。我想按原样对字节进行移位。非常好的解释!呵呵,好吧。我明白你说的,只是这是我第一次遇到“掩蔽”。我想我需要先了解一下。。。非常感谢你:D