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值