下面小编就为大家带来一篇Java 字节数组类型(byte[])与int类型互转方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
代码如下:
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类型互转方法的代码实例的内容,更多相关内容请关注PHP中文网(www.php.cn)!

本文讨论了使用Maven和Gradle进行Java项目管理,构建自动化和依赖性解决方案,以比较其方法和优化策略。

本文使用Maven和Gradle之类的工具讨论了具有适当的版本控制和依赖关系管理的自定义Java库(JAR文件)的创建和使用。

本文讨论了使用咖啡因和Guava缓存在Java中实施多层缓存以提高应用程序性能。它涵盖设置,集成和绩效优势,以及配置和驱逐政策管理最佳PRA

本文讨论了使用JPA进行对象相关映射,并具有高级功能,例如缓存和懒惰加载。它涵盖了设置,实体映射和优化性能的最佳实践,同时突出潜在的陷阱。[159个字符]

Java的类上载涉及使用带有引导,扩展程序和应用程序类负载器的分层系统加载,链接和初始化类。父代授权模型确保首先加载核心类别,从而影响自定义类LOA

本文解释了用于构建分布式应用程序的Java的远程方法调用(RMI)。 它详细介绍了接口定义,实现,注册表设置和客户端调用,以解决网络问题和安全性等挑战。

本文详细介绍了用于网络通信的Java的套接字API,涵盖了客户服务器设置,数据处理和关键考虑因素,例如资源管理,错误处理和安全性。 它还探索了性能优化技术,我

本文详细介绍了创建自定义Java网络协议。 它涵盖协议定义(数据结构,框架,错误处理,版本控制),实现(使用插座),数据序列化和最佳实践(效率,安全性,维护


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

Dreamweaver Mac版
视觉化网页开发工具

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能