Java 请给我解释一下为什么24,16,8用于将int转换成字节?
下面的代码将int转换为Bytes数组。 我知道intJava 请给我解释一下为什么24,16,8用于将int转换成字节?,java,integer,byte,Java,Integer,Byte,下面的代码将int转换为Bytes数组。 我知道intI右移了24、16、8次,并与0xFF进行and运算,但我不明白的是为什么要使用这些数字 private static byte[] intToBytes(int i) // split integer i into 4 byte array { // map the parts of the integer to a byte array byte[] integerBs = new byte[4]; int
I
右移了24、16、8次,并与0xFF进行and运算,但我不明白的是为什么要使用这些数字
private static byte[] intToBytes(int i)
// split integer i into 4 byte array
{
// map the parts of the integer to a byte array
byte[] integerBs = new byte[4];
integerBs[0] = (byte) ((i >>> 24) & 0xFF);
integerBs[1] = (byte) ((i >>> 16) & 0xFF);
integerBs[2] = (byte) ((i >>> 8) & 0xFF);
integerBs[3] = (byte) (i & 0xFF);
// for (int j=0; j < integerBs.length; j++)
// System.out.println(" integerBs[ " + j + "]: " + integerBs[j]);
return integerBs;
} // end of intToBytes()
专用静态字节[]intToBytes(inti)
//将整数i拆分为4字节数组
{
//将整数部分映射到字节数组
byte[]integerBs=新字节[4];
整数b[0]=(字节)((i>>>24)和0xFF);
integerBs[1]=(字节)((i>>>16)和0xFF);
整数b[2]=(字节)((i>>>8)和0xFF);
integerBs[3]=(字节)(i&0xFF);
//对于(int j=0;j
32位整数由四个字节组成:
- 字节0从第0位开始李>
- 字节1从第8位开始李>
- 字节2从第16位开始李>
- 字节3从第24位开始
integerBs[3] = (byte) (i & 0xFF);
与
integerBs[2] = (byte) ((i >>> 0) & 0xFF);
这是缺少的零。由于
int
由四个字节组成,您可以通过移位8位的倍数=1字节来“到达”int中的每个字节
为了获得第一个字节,将int
移位24位=3字节,将第二个字节移位16位=2字节,依此类推
屏蔽&0xFF
用于防止溢出,因此您只获取所需的字节
想象一下
31 0
| |
11111111111111111111111111111111
右移24等于
31 0
| |
00000000000000000000000011111111
使用
&0xFF
掩蔽它可以得到0到7之间的8位 Ok让我们假设您有一个32位二进制数:
00001111 00000111 00000011 00000001
一个字节相当于8位,因此上面的数字由4个字节组成
要分离出这些字节,我们需要执行一系列移位和掩码操作
例如,要获取第一个字节(00001111)
,我们执行以下操作:
00001111 00000111 00000011 00000001 (original)
00000000 00000000 00000000 00001111 (shifted 24 spaces to the right)
现在,我们不希望这3个字节的零出现在前面,因此我们使用一个8位掩码(0xFF)
,并在我们的32位
结果数字和掩码之间执行和
操作
例如:
00000000 00000000 00000000 00001111
&& 11111111
-----------------------------------
00001111 (the first byte)
现在您可以想象如何获得第二个字节(仅向右移动16位)。其全部目的是在前8个位置获得所需的8位,并使用掩码清除前面的垃圾。一些整数:
1111100101010101010011001001001010010101010011010
右移24位:
11111001010
与0xFF进行AND运算:
11111001010
0000 1111111 1111
0000 1001 1010 …这只是第4个字节 整数: 1111100101010101010011001001001010010101010011010 右移16位: 1111100101010011010 与0xFF进行AND运算: 1111100101010011010 0000 0000 1111111 1111
0000 0000 1001 1010 …这只是第3个字节
等等。整数是4字节,字节是8位。该函数忽略数字的“endianness”,这可能会导致数组中出现垃圾。将整数视为十六进制数可能会有所帮助。您也可以在此处找到一个很好的解释: