关于JAVA中:int和byte的互相转换
2018-01-02 10:42
387 查看
一、基础概念:
1.原码:
一个byte是一个字节,一个字节是由8个位组成。其中最高位是符号位,范围就是127 ~ -128。
即:0111 1111~1111 1111
也就是说:0000 0001 代表的是1,
1000 0000 代表的是-1。
2.反码:
正数的反码是其本身(正数的符号位是0);
负数的反码是:在原码的基础上,符号位不变,其他位取反。(负数的符号位是1)
即:-1的原码是: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之间的互相转换。
相关文章推荐
- java byte 与int的互相转换
- java 里byte int互相转换为什么要与0xff
- java 关于int 和byte间的转换,请教各位!
- Java 将byte[] 与int类型互相转换
- java byte转int 互相转换原理详解
- java byte[] 与int float long 等的互相转换
- java笔记--关于int和byte[]的转换
- Java将byte[]和int的互相转换
- java笔记--关于int和byte[]的转换
- Java中byte与16进制字符串的互相转换
- java中byte数组与int类型之间的相互转换(两种方式)
- java中byte数组与int类型的转换(两种方式)
- java中byte转换int时为何与0xff进行与运算
- java中byte转换int时为何与0xff进行与运算
- Java中byte转换int时与0xff进行与运算的原因
- 在Java中int和byte[]的相互转换
- java中byte转换int时为何与0xff进行与运算
- Java中byte与16进制字符串的互相转换
- Java中int类型和tyte[]之间转换及byte[]合并
- int与byte互相转换,1个int存储4个byte