所以第一个:位转移
我想你听说过二进制数字。现在大多数人在我们的日常业务中使用十进制数字系统,您的数字范围从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,长,短,字节,...)工作,所以它们填充在左边用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(这里所说的正数,因为负数有点不同)。
我们第二个:屏蔽 这是现在这个部分: SDATA [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和0的每一位,其中任一输入为0返回1:
0101010101010101
&
0000000011111111
=
0000000001010101
所以你看,你可以使用& - 运算符来屏蔽掉所有的在一个输入字符串中为0的位。
那么该函数的那部分功能是将短(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
您应该真的了解Java运算符的功能 - 只有这么多。 +, - ,*和/不够。 – Ingo