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;   
} 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值