byte 与 int 转换

复习过程中,遇到的不太理解的地方

(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;   
} 

你可能感兴趣的:(Java基础,byte,0xff)