天天看點

java中byte(負值)作&運算時0xff的作用

1.問題由來

項目中遇到一個将byte位元組流轉換成有符号整數和無符号整數的,發現:

byte aByte = ByteBuffer.get();----對應的二進制各位

如果byte為正數:int value = (byte)aByte ----> 比如 傳輸8位bits為 0x7f

轉化為位元組為:aByte=127: 01111111  轉化為 int 就是:00000000 00000000 00000000 01111111

如果byte為負數:int value = (byte)aByte ---->比如  傳輸8位bits為 0xff 

轉化為位元組為:aByte=-1    : 11111111 轉化為 int 就是:11111111 11111111 11111111 11111111

(注意:負數在計算機中以補碼方式存儲  是以有: -1= [10000001]原->[111111110]反->[11111111]補)

那麼轉化為無符号整數就不能直接轉byte值。(負數或者>127的正數都不行)

那麼問題是:如何把byte值還原成無符号值并放入int 中

2.解決方法

首先,參考自一個部落格:http://www.360doc.com/content/10/0813/21/495229_45854066.shtml

這裡面解釋了byte轉int要與0xff與的原因。

經典的例子是:

(1)System.out.println((byte)-1);// -1

(2)System.out.println((byte)-1 & 0xff);// 255

(1)中,(byte)-1自動轉化成int,由于位數拓展了,負數位數拓展(8bit--->32bit),則補1,值發生了改變

(2)中,(byte)-1 &0xff 則,byte轉成int

即11111111 11111111 11111111 11111111 & 00000000 00000000 00000000 11111111(0xff)

前24位被置零,是以得到最初的0xff值