Java 逻辑和算术移位';s输出
这里有一个小小的java程序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);
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