代码如下:

public class CommonUtils {
//高位在前,低位在后
public static byte[] int2bytes(int num){
byte[] result = new byte[4];
result[0] = (byte)((num >>> 24) & 0xff);//说明一
result[1] = (byte)((num >>> 16)& 0xff );
result[2] = (byte)((num >>> 8) & 0xff );
result[3] = (byte)((num >>> 0) & 0xff );
return result;
} //高位在前,低位在后
public static int bytes2int(byte[] bytes){
int result = 0;
if(bytes.length == 4){
int a = (bytes[0] & 0xff) << 24;//说明二
int b = (bytes[1] & 0xff) << 16;
int c = (bytes[2] & 0xff) << 8;
int d = (bytes[3] & 0xff);
result = a | b | c | d;
}
return result;
} public static void main(String[] args){
int a = -64;
System.out.println("-64="+Integer.toBinaryString(-64));
byte[] bytes = CommonUtils.int2bytes(a);
for(int i = 0 ; i<4 ; i++){
System.out.println(bytes[i]);
}
a = CommonUtils.bytes2int(bytes);
System.out.println(a); }
}

运行结果如下:

-64=11111111111111111111111111000000
-1
-1
-1
-64
-64

说明1:

-64转化为二进制原码为[10000000][00000000][00000000][01000000]

将原码变为补码为[11111111][11111111][11111111][11000000],与控制台输出结果相同,可以看到在java中二进制以补码的形式表示

-64  >>> 24后(无符号右移,高位补0),变为[00000000][00000000][00000000][11111111]

将上步结果& 0xff后,依然为[00000000][00000000][00000000][11111111],由于0xff的值为[00000000][00000000][00000000][11111111],故& 0xff的目的是将最低8位保持不变,其余位置为0

然后将结果强转为byte类型,保留低位,截去高位,变为[11111111],可以看出上步的0xff其实是没有必要的,无论高位是多少,最终都会被截去

故result[0]为[11111111]=-1

依此类推:

result[1]为[11111111]=-1

result[2]为[11111111]=-1

result[3]为[11000000]=-64

说明2:

byte[0]为[11111111],首先会将byte[0]转化为int类型(在位移运算前,会将byte类型转换为int类型,如果为正数,高位补0,如果为负数,高位补1),高位补1,变为[11111111][11111111][11111111][11111111]

将上步结果& 0xff之后,将变为[00000000][00000000][00000000][11111111]

然后将上步结果 << 24(左位移,低位补0),将变为[11111111][00000000][00000000][00000000] = a

同理获得b、c、d

最终a | b | c | d 即:

[11111111][00000000][00000000][00000000] |

[00000000][11111111][00000000][00000000] |     由于<<16位之前& 0xff,故保证b的最高8位都为0

[00000000][00000000][11111111][00000000] |     由于<<8位之前& 0xff,故保证c的最高16位都为0

[00000000][00000000][00000000][11000000]        由于& 0xff,故保证d的最高24为都为0

=[11111111][11111111][11111111][11000000] = -64

可以看到为了保证byte转换成int时,补位不对最终a | b | c | d的结果产生影响(置为0),& 0xff是必须的

short与byte[]之间的转换,long与byte[]之间的转换也是类似的

PS:

1,int类型占4个字节,而byte类型只占1个字节

2,原码:最高位为符号位,其余位用来表示数值大小

2的原码:00000010

-2的原码:10000010

3,反码:正数的反码与其原码相同;负数的反码符号位保持不变,其余位按位取反

2的反码:00000010

-2的反码:11111101

4,补码:正数的补码与其原码相同;负数的补码为该负数的反码+1

2的补码:00000010

-2的补码:11111110

Java 字节数组类型(byte[])与int类型互转的更多相关文章

  1. JAVA IO分析二:字节数组流、基本数据&对象类型的数据流、打印流

    上一节,我们分析了常见的节点流(FileInputStream/FileOutputStream  FileReader/FileWrite)和常见的处理流(BufferedInputStream/B ...

  2. java中整数的默认为int类型的一些问题

    thingking in java 读书感悟 作者 :淮左白衣 写于2018年4月8日17:51:44 关于整数的默认类型,以及会产生的一些小问题 涉及基本数据类型的重载 关于整数的默认类型,以及会产 ...

  3. Java中返回值定义为int类型的 方法return 1返回的是int还是Integer&&finally中return问题

    在Java中返回值定义为int类型的 方法return 1:中返回的是Integer值,在返回的时候基本类型值1被封装为Integer类型. 定义一个Test类,在异常处理try中和finally中分 ...

  4. Java 中要将 String 类型转化为 int 类型

    在 Java 中要将 String 类型转化为 int 类型时,需要使用 Integer 类中的 parseInt() 方法或者 valueOf() 方法进行转换. 例1: 1 2 3 4 5 6 S ...

  5. System.Buffer 以字节数组(Byte[])操作基元类型数据

    1. Buffer.ByteLength:计算基元类型数组累计有多少字节组成. 该方法结果等于"基元类型字节长度 * 数组长度" , , }; , , }; , , }; Cons ...

  6. java 字节数组转int

    4字节数组转int类型 小端模式 /** * 数组转int类型 * * @param src * @return */ public static int bytesToInt(byte[] src) ...

  7. C#后台接java接口传输字节数组(byte[])

    事情是这样的C#t代码之前接的WCF接口,后来那边统一改为java的接口,我是用的HttpClient从后台发请求调用的java接口,其他接口都很顺利,是的....知道遇到一个需要传byte[]类型数 ...

  8. Java字节数组流学习

    字节数组流 基于内存操作,内部维护着一个字节数组,我们可以利用流的读取机制来处理字符串.无需关闭,不会报IOException. ByteArrayInputStream 包含一个内部缓冲区,该缓冲区 ...

  9. 基于java的InputStream.read(byte[] b,int off,int len)算法学习

    public int read(byte[] b, int off, int len) throws IOException 将输入流中最多 len 个数据字节读入字节数组.尝试读取多达 len 字节 ...

随机推荐

  1. URAL1036. Lucky Tickets

    链接 dp[i][j] += dp[i-1][j-g];背包吧 数据太大了 还是JAVA好用 import java.io.*; import java.math.*; import java.tex ...

  2. Java Memory Management(1)

    Java Memory Management, with its built-in garbage collection, is one of the language’s finest achiev ...

  3. [Hadoop源码解读](六)MapReduce篇之MapTask类

    MapTask类继承于Task类,它最主要的方法就是run(),用来执行这个Map任务. run()首先设置一个TaskReporter并启动,然后调用JobConf的getUseNewAPI()判断 ...

  4. windows权限错误

    1.installer "内部错误 2203 C:\WINDOWS\Installer\354787.ipi,-2147287035” 用户的local\Temp目录没有system权限 2 ...

  5. spring--处理器拦截器详解——跟着开涛学SpringMVC

    5.1.处理器拦截器简介 Spring Web MVC的处理器拦截器(如无特殊说明,下文所说的拦截器即处理器拦截器) 类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理. ...

  6. ZOJ3261 Connections in Galaxy War 并查集

    分析:对于这种删边操作,我们通常可以先读进来,然后转化离线进行倒着加边 #include <stdio.h> #include <string.h> #include < ...

  7. GUN/GPL 中文译文

    版权所有 (C) 1989,1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307U ...

  8. 编译 skia

    0.准备工作 在 https://android.googlesource.com/ 用 git 代码,当然也可以从skia的官方https://code.google.com/p/skia/ 中获取 ...

  9. JDK1.5新特性(一)……Enhanced for Loop

    援引 Enhanced for Loop - This new language construct eliminates the drudgery and error-proneness of it ...

  10. sed写的命令收集

    1. 替换一行字符串. <title name= > <param name="root", value="haha"/> <pa ...