关于JAVA中:int和byte的互相转换

 

一、基础概念:

1.原码:

一个byte是一个字节,一个字节是由8个位组成。其中最高位是符号位,范围就是127 ~ -128。

即:0111 1111~1111 1111

也就是说:0000 0001 代表的是1,

   1000 0000 代表的是-128。
2.反码:

正数的反码是其本身(正数的符号位是0);

负数的反码是:在原码的基础上,符号位不变,其他位取反。(负数的符号位是1)

即:-128的原码是:1000 0000

反码是:1111 1111

3.补码:

补码是在原码的基础上,符号位不变,其他位取反+1。

例如: 1的原码是:0000 0001
   反码是:0000 0001

符号位不变,取反:  0111 1111

+1(逢二进一)
   补码是:1111 1111

 

 

二、将byte转换为int:

首先:一个int有4个八位,也就是4个字节。
1.如果我们要讲一个byte[]数组转换为int类型:

首先看如下代码:

 

	/**
	 * byte数组转int类型的对象
	 * @param bytes
	 * @return
	 */
	public int Byte2Int(Byte[]bytes) {
		return (bytes[0]&0xff)<<24
			| (bytes[1]&0xff)<<16
			| (bytes[2]&0xff)<<8
			| (bytes[3]&0xff);
	}

因为一个byte是八位,int有四个八位,所以将这个byte[0]左移24位,就将这个byte[0]放在了int的最高一个八位上。

 

同理,byte[1]放置在第二个八位上,byte[2]放置在第三个八位上,byte[3]放置在第四个八位上。

2.问题:为什么要&0xff

首先0xff是十六进制的255,也就是二进制的1111 1111,对0xff取与,实际上就是要取这个数最低八位的值,截一个字节的长度。

如果不用&0xff:

①计算机中是用补码的方式进行存储数据。

②如果不用&0xff,那么在进行负数的运算时就会出现问题,如:使用-1进行运算,-1的byte补码是:1111 1111,对应的十六进制数字是0xff;

                           -1的int补码(32位)是1111 1111 1111 1111 1111 1111,如果将byte转换为int,那么对应的十六进制数是0xffff。

结果不正确(对于负数而言)。

所以为了计算结果的正确性,我们就要对字节进行&0xff操作。

 

三、将int转换为byte[ ]:

只需要进行相反的方向操作就好:

 

	/**
	 * int转byte数组
	 * @param bytes
	 * @return
	 */
	public byte[]IntToByte(int num){
		byte[]bytes=new byte[4];
		bytes[0]=(byte) ((num>>24)&0xff);
		bytes[1]=(byte) ((num>>16)&0xff);
		bytes[2]=(byte) ((num>>8)&0xff);
		bytes[3]=(byte) (num&0xff);
		return bytes;
	}

 

 

 

这样就完成了int和byte之间的互相转换。

 

  • 7
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值