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值

你可能感兴趣的:(程序基础)