本文已参与「新人创作礼」活动,一起开启掘金创作之路。
前置知识: 传送
如果还不了解请看往期博客: 传送
int 转 byte数组
/**
* 一个int是4个byte 1个byte是8个bit 所以要右移位三次 每次8位
* 如 1111 1111 1010 1010 0101 0101 0000 0000
* [1111 1111, 10101 010, 0101 0101, 0000 0000]
*/
private static byte[] toByteArr(int i) {
// 因为一个 int 类型是 4个 byte 所以这里要开辟 4位 空间
byte[] b = new byte[4];
// 16 进制的 0xFF 也就是 2进制中的 1111 1111 这一步是获得前8位的二进制数据
b[0] = (byte) ((i >>> 24) & 0xFF);
// 同理 这一步是获取 第9位到第16位的二进制数据
b[1] = (byte) ((i >>> 16) & 0xFF);
// ...
b[2] = (byte) ((i >>> 8) & 0xFF);
b[3] = (byte) (i & 0xFF);
// 因为 int 是 32 个 bit 所以到这里就获取到 字节数组了
return b;
}
byte数组 转 int
/**
* 一个int 4个字节 每个字节8位 所以要左移位三次 每次8位
*/
private static int toInt(byte[] b) {
// 合并规则主要看 如何转的 byte数组
// 如果转 byte[] 是从前8位右移 那么转 int 需要从 (32-8) 位开始左移
return (b[0] & 0xFF) << 24 | (b[1] & 0xFF) << 16 | (b[2] & 0xFF) << 8 | (b[3] & 0xFF);
}
int 转 byte数组原理
比如要转的数为 9 那么需要先转为2进制
0000 0000 0000 0000 0000 0000 0000 1001
第一次右移24位 获得到 0000 0000 & 1111 1111 = 0
第二次右移16位 获得到 0000 0000 & 1111 1111 = 0
第三次右移8位 获得到 0000 0000 & 1111 1111 = 0
第四次无需移位 获得到 0000 1001 & 1111 1111 = 0b1001 = 9
最终结果为: [0, 0, 0, 9]
byte数组 转 int 原理
反推 [0, 0, 0, 9]
获得到第一个字节的二进制值 0 = 0000 0000 0000 0000 0000 0000 0000 0000
获得到第二个字节的二进制值 0 = 0000 0000 0000 0000 0000 0000 0000 0000
获得到第三个字节的二进制值 0 = 0000 0000 0000 0000 0000 0000 0000 0000
获得到第四个字节的二进制值 0 = 0000 0000 0000 0000 0000 0000 0000 1001
第一个字节左24移位 并且 & 0xFF 获得到 0000 0000 |
第二个字节左16移位 并且 & 0xFF 获得到 0000 0000 |
第三个字节左8移位 并且 & 0xFF 获得到 0000 0000 |
第四个字节无需移位 并且 & 0xFF 获得到 0000 1001
合并结果 0000 0000 0000 0000 0000 0000 0000 1001 = 9
测试
public static void main(String[] args) {
byte[] bytes = toByteArr(9);
System.out.println(Arrays.toString(bytes));
System.out.println(toInt(bytes));
System.out.println();
byte[] bytes1 = toByteArr(-65555);
System.out.println(Arrays.toString(bytes1));
System.out.println(toInt(bytes1));
System.out.println();
byte[] bytes2 = toByteArr(Integer.MAX_VALUE);
System.out.println(Arrays.toString(bytes2));
System.out.println(toInt(bytes2));
System.out.println(Integer.MAX_VALUE);
}
结果
A:\Work\jdk1.8\bin\java.exe ...
[0, 0, 0, 9]
9
[-1, -2, -1, -19]
-65555
[127, -1, -1, -1]
2147483647
2147483647
Process finished with exit code 0
结束
这就是本期的运算符讲解 感觉有用就点个赞吧 如果有错误或更好的方法评论区请多多指出 相互学习共同进步