复习过程中,遇到的不太理解的地方
(byte)b & 0xff
byte to int
比较下面两个
public static int byte2Int(byte b){
return (int)b;
}
public static int byte2Int(byte b){
return (int)(b & 0xff);
}
疑问
你肯定在想这个与操作有什么影响吗?
是的,有影响 。以下是我的理解
& 0xff
0xff 的功能其实是补全32位int的 byte b = 11111111 ; // 脑袋里想的二进制表示 -1 b & 0xff 结果是: 000...000(24个)11111111 这样,得到的32位int值是用24个0补全的,所以我们得到的int值为 255
(int) b
没有与操作,我们可以考虑它是如何补全32位int的: 若b表示负数,则用1补全位数,111111111...111(32个) 此为补码,补码求原码:符号为1,其余位取反加1. 还是 -1
所以,byte转int我们要理解是否考虑符号位。
强制类型转换较常用。
int 转 byte ,只需截取int的低8位即可
可以看到& 0xff 这一操作其实是保持了byte二进制的表示,这一特点我们后面会提到。
byte[] to int
如果说 byte 转 int 要考虑符号位,那么byte数组呢(4个byte转换1个int)
这时,我们要保持二进制的表示,什么意思呢
4个byte: -1 2 3 4 -1: 11111111 2 : 00000010 3 : 00000011 4 : 00000100 得到的int值为该二进制表示拼接而成(方便理解) 11111111 00000010 00000011 00000100 值为多少,就要看高位低位了(大端小端)。
从这里可以看出,byte 拼接的过程中可以使用 & 0xff
// byte数组长度为4, bytes[3]为高8位
public static int bytes2Int(byte[] bytes){
int value=0;
value = ((bytes[3] & 0xff)<<24)|
((bytes[2] & 0xff)<<16)|
((bytes[1] & 0xff)<<8)|
(bytes[0] & 0xff);
return value;
}
int to byte[]
public static byte[] int2Bytes( int value )
{
byte[] src = new byte[4];
src[3] = (byte) ((value>>24) & 0xFF);
src[2] = (byte) ((value>>16) & 0xFF);
src[1] = (byte) ((value>>8) & 0xFF);
src[0] = (byte) (value & 0xFF);
return src;
}