关于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之间的互相转换。

 

展开阅读全文

没有更多推荐了,返回首页