java 位运算转换 bit operator convert

位运算专题

Java Bit Operation-位运算基本概念介绍

Java Bit Operation-位运算类型转换

leetcode bit operator 位运算入门介绍

leetcode 002-leetcode.136 single-number 力扣.136 只出现一次的数字

leetcode 002-leetcode.137 single-number-ii 力扣.137 只出现一次的数字II

leetcode 002-leetcode.260 single-number-iii 力扣.260 只出现一次的数字III

问题

对于 32 位的字符串 379a1e5df3534885a94001373467f33e,如果想转换为整数。

JDK 内置的方法

借助 BigInteger

java 复制代码
new BigInteger("379a1e5df3534885a94001373467f33e", 16)

结果为

复制代码
73907769400197500546813542834226328382

jdk1.8 的方法

java 复制代码
long result = Long.parseUnsignedLong("379a1e5df3534885a94001373467f33e", 16);

最大值问题

这种转换在某种程度上,要考虑到最大值的问题。

将 byte 转换为 int

首先:一个int有4个八位,也就是4个字节。

代码

如果我们要讲一个 byte[] 数组转换为int类型:

首先看如下代码:

java 复制代码
/**
 * byte数组转int类型的对象
 *
 * @param bytes 字节数组
 * @return int
 */
public int byteToInt(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]放置在第四个八位上。

  • 问题:为什么要 &0xff?

首先 0xff 是十六进制的255,也就是二进制的1111 1111,对0xff取与,实际上就是要取这个数最低八位的值,截一个字节的长度。

  • 如果不用&0xff:
  1. 计算机中是用补码的方式进行存储数据。

  2. 如果不用&0xff,那么在进行负数的运算时就会出现问题,如:使用-1进行运算,-1的byte补码是:1111 1111,对应的十六进制数字是0xff;

-1的int补码(32位)是1111 1111 1111 1111 1111 1111,如果将byte转换为int,那么对应的十六进制数是0xffff。

结果不正确(对于负数而言)。

所以为了计算结果的正确性,我们就要对字节进行&0xff操作。

将int转换为byte[]:

只需要进行相反的方向操作就好:

java 复制代码
/**
 * int转byte数组
 *
 * @param num 整数
 * @return byte 数组
 */
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;
}

参考资料

byteToInt64

convert-toint64-equivalent-in-java

分布式系统唯一ID生成方案汇总

byte 与 int 互转

Java将byte[]和int的互相转换

关于JAVA中:int和byte的互相转换

相关推荐
yujkss3 分钟前
23种设计模式之【抽象工厂模式】-核心原理与 Java实践
java·设计模式·抽象工厂模式
Keying,,,,4 分钟前
力扣hot100 | 多维动态规划 | 62. 不同路径、64. 最小路径和、5. 最长回文子串、1143. 最长公共子序列、72. 编辑距离
算法·leetcode·动态规划
我命由我123459 分钟前
Android 实例 - Android 圆形蒙版(Android 圆形蒙版实现、圆形蒙版解读)
android·java·java-ee·android studio·安卓·android-studio·android runtime
会开花的二叉树10 分钟前
上手 cpp-httplib:轻量级 C++ HTTP 库的安装与实战指南
开发语言·c++·http
周杰伦fans10 分钟前
C# 集合框架完全指南:从IEnumerable到ObservableCollection的深度解析
开发语言·c#
秦禹辰20 分钟前
开源多场景问答社区论坛Apache Answer本地部署并发布至公网使用
开发语言·后端·golang
lifallen25 分钟前
Flink Watermark机制解析
大数据·算法·flink
IT古董25 分钟前
【第五章:计算机视觉-项目实战之目标检测实战】1.目标检测算法理论-(6)一阶段目标检测算法YOLO系列思想详解:YOLOV1~YOLOV10
算法·目标检测·计算机视觉
小旺不正经30 分钟前
数据库表实现账号池管理
数据库·后端·算法
咖啡Beans31 分钟前
SpringBoot集成Clickhouse
java·spring boot