我目前正在做一个小项目,我最终弄乱了字节、短值等,
读了一些之后,我仍然不明白一些东西,比如什么是“位移位”,我们为什么要用它,什么时候需要它,它是如何工作的。
此外,我发现这个函数可以将 short 转换为字节:
private byte[] short2byte(short[] sData) {
int shortArrsize = sData.length;
byte[] bytes = new byte[shortArrsize * 2];
for (int i = 0; i < shortArrsize; i++) {
bytes[i * 2] = (byte) (sData[i] & 0x00FF);
bytes[(i * 2) + 1] = (byte) (sData[i] >> 8);
sData[i] = 0;
}
return bytes;
}
我想我理解这个函数,但我的问题是我不确定这两行在做什么:
bytes[i * 2] = (byte) (sData[i] & 0x00FF);
bytes[(i * 2) + 1] = (byte) (sData[i] >> 8);
我认为这与位移有关,所以有人可以解释一下这是什么意思吗?如果您有关于字节、短、位移位等的链接或良好文档,请尽可能包括在内。
亲切的问候
第一个:位移位
我猜你听说过二进制数。现在大多数人在我们的日常业务中使用十进制数字系统,其中数字范围为 0-9。您使用的每个数字都由 0-9 的数字组成。二进制只使用数字0和1,这对计算机使用来说非常方便,从此你可以轻松地表示数字的幂:
0 = 没有电
1 = 功率
与十进制数字系统相同,您只需将数字并排放置就可以得到更大的数字:在十进制中,10 等于 9+1。在二进制中,10 是 1+1。
Binary = Decimal
0 = 0
1 = 1
10 = 2
11 = 3
100 = 4
101 = 5
110 = 6
111 = 7
等等。
计算机通常使用固定长度的数字(至少使用整数类型的数字,如 int、long、short、byte 等),因此它们用 0 填充左侧所有剩余数字:
5 in decimal = 101 in binary = 00000101 in 8-bit (byte) = 0000000000000101 in 16-bit (short)
等等。
位移位的作用是将所有位移动到一个方向:
Right-Shift by two digits:
00001101 >> 2 = 00000011
Left-Shift by three digits:
00001101 << 3 = 01101000
左移相当于乘以2,右移相当于除以2(这里说的是正数,因为负数有点不同)。
现在进入第二个:掩蔽
现在是关于这部分的:
数据[i] & 0x00FF
首先,这里我们有另一种数字表示法:十六进制数。它的工作原理与刚才的二进制数非常相似,有 16 个不同的数字:0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。它们中的每一个都代表四位二进制数字,因此您可以通过将每个数字替换为以下数字来在两者之间进行转换:
Hex = Binary
0 = 0000
1 = 0001
2 = 0010
3 = 0011
4 = 0100
5 = 0101
6 = 0110
7 = 0111
8 = 1000
9 = 1001
A = 1010
B = 1011
C = 1100
D = 1101
E = 1110
F = 1111
所以这里给出的数字 0x00FF 在 16 位二进制中等于 0000000011111111。
现在到 &,或实际的屏蔽。 &-运算符对于两个输入均为 1 的每一位返回 1,对于其中一个输入为 0 的每一位返回 0:
0101010101010101
&
0000000011111111
=
0000000001010101
所以您看,您可以使用 &-运算符屏蔽掉一个输入字符串中所有为 0 的位。
所以该函数的这一部分所做的是将 short(16 位长)拆分为两个单独的 8 位字节。假设 sData[i] 包含这个数字:0011001101010101
bytes[i * 2] = (byte) (sData[i] & 0x00FF);
=
bytes[i * 2] = (byte) (0011001101010101 & 0000000011111111);
=
bytes[i * 2] = (byte) (0000000001010101); //lower 8 bit
bytes[(i * 2) + 1] = (byte) (sData[i] >> 8);
=
bytes[(i * 2) + 1] = (byte) (0011001101010101 >> 8); //Right shift by 8 spaces
=
bytes[(i * 2) + 1] = (byte) (0000000000110011); //upper 8 bit