html5中文学习网

您的位置: 首页?>?网络编程?>?java二元倍投表 ? 正文

Java 字节数组类型(byte[])与int类型互转方法_java_

[ ] 已经帮助:人解决问题

代码如下:CQSHTML5中文学习网 - HTML5先行者学习网

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);  }}

运行结果如下:CQSHTML5中文学习网 - HTML5先行者学习网

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

说明1:CQSHTML5中文学习网 - HTML5先行者学习网

-64转化为二进制原码为[10000000][00000000][00000000][01000000]CQSHTML5中文学习网 - HTML5先行者学习网

将原码变为补码为[11111111][11111111][11111111][11000000],与控制台输出结果相同,可以看到在java中二进制以补码的形式表示CQSHTML5中文学习网 - HTML5先行者学习网

-64 >>> 24后(无符号右移,高位补0),变为[00000000][00000000][00000000][11111111]CQSHTML5中文学习网 - HTML5先行者学习网

将上步结果& 0xff后,依然为[00000000][00000000][00000000][11111111],由于0xff的值为[00000000][00000000][00000000][11111111],故& 0xff的目的是将最低8位保持不变,其余位置为0CQSHTML5中文学习网 - HTML5先行者学习网

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

故result[0]为[11111111]=-1CQSHTML5中文学习网 - HTML5先行者学习网

依此类推:CQSHTML5中文学习网 - HTML5先行者学习网

result[1]为[11111111]=-1CQSHTML5中文学习网 - HTML5先行者学习网

result[2]为[11111111]=-1CQSHTML5中文学习网 - HTML5先行者学习网

result[3]为[11000000]=-64CQSHTML5中文学习网 - HTML5先行者学习网

说明2: CQSHTML5中文学习网 - HTML5先行者学习网

byte[0]为[11111111],首先会将byte[0]转化为int类型(在位移运算前,会将byte类型转换为int类型,如果为正数,高位补0,如果为负数,高位补1),高位补1,变为[11111111][11111111][11111111][11111111]CQSHTML5中文学习网 - HTML5先行者学习网

将上步结果& 0xff之后,将变为[00000000][00000000][00000000][11111111]CQSHTML5中文学习网 - HTML5先行者学习网

然后将上步结果 << 24(左位移,低位补0),将变为[11111111][00000000][00000000][00000000] = aCQSHTML5中文学习网 - HTML5先行者学习网

同理获得b、c、dCQSHTML5中文学习网 - HTML5先行者学习网

最终a | b | c | d 即:CQSHTML5中文学习网 - HTML5先行者学习网

[11111111][00000000][00000000][00000000] | CQSHTML5中文学习网 - HTML5先行者学习网
CQSHTML5中文学习网 - HTML5先行者学习网

[00000000][11111111][00000000][00000000] | 由于<<16位之前& 0xff,故保证b的最高8位都为0CQSHTML5中文学习网 - HTML5先行者学习网
CQSHTML5中文学习网 - HTML5先行者学习网

[00000000][00000000][11111111][00000000] | 由于<<8位之前& 0xff,故保证c的最高16位都为0CQSHTML5中文学习网 - HTML5先行者学习网
CQSHTML5中文学习网 - HTML5先行者学习网

[00000000][00000000][00000000][11000000] 由于& 0xff,故保证d的最高24为都为0CQSHTML5中文学习网 - HTML5先行者学习网

=[11111111][11111111][11111111][11000000] = -64CQSHTML5中文学习网 - HTML5先行者学习网
CQSHTML5中文学习网 - HTML5先行者学习网

可以看到为了保证byte转换成int时,补位不对最终a | b | c | d的结果产生影响(置为0),& 0xff是必须的CQSHTML5中文学习网 - HTML5先行者学习网

short与byte[]之间的转换,long与byte[]之间的转换也是类似的CQSHTML5中文学习网 - HTML5先行者学习网

PS:CQSHTML5中文学习网 - HTML5先行者学习网

1,int类型占4个字节,而byte类型只占1个字节CQSHTML5中文学习网 - HTML5先行者学习网

2,原码:最高位为符号位,其余位用来表示数值大小CQSHTML5中文学习网 - HTML5先行者学习网

2的原码:00000010CQSHTML5中文学习网 - HTML5先行者学习网

-2的原码:10000010CQSHTML5中文学习网 - HTML5先行者学习网

3,反码:正数的反码与其原码相同;负数的反码符号位保持不变,其余位按位取反CQSHTML5中文学习网 - HTML5先行者学习网

2的反码:00000010 CQSHTML5中文学习网 - HTML5先行者学习网

-2的反码:11111101CQSHTML5中文学习网 - HTML5先行者学习网

4,补码:正数的补码与其原码相同;负数的补码为该负数的反码+1CQSHTML5中文学习网 - HTML5先行者学习网

2的补码:00000010CQSHTML5中文学习网 - HTML5先行者学习网

-2的补码:11111110CQSHTML5中文学习网 - HTML5先行者学习网

以上这篇Java 字节数组类型(byte[])与int类型互转方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。CQSHTML5中文学习网 - HTML5先行者学习网

(责任编辑:)
推荐书籍
推荐资讯
关于HTML5先行者 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助