2014-02-05 214 views
1

我目前正在开发一个小型项目,我最终搞乱了字节,短值等, ,经过一番阅读后,我仍然不明白一些东西,比如什么是“位移“,为什么我们使用它,我们什么时候需要,以及它是如何工作的。Java位移位,短转换为字节

另外,我发现这个功能将短成字节:

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); 

我认为这与位移有关,所以有人可以解释这是什么意思?如果你有关于字节,短小,位移等的链接或者很好的文档,请尽可能包括这些。

亲切的问候

+2

您应该真的了解Java运算符的功能 - 只有这么多。 +, - ,*和/不够。 – Ingo

回答

2

所以第一个:位转移

我想你听说过二进制数字。现在大多数人在我们的日常业务中使用十进制数字系统,您的数字范围从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 
+0

我真的很感谢你花了你的时间和精力来解释我......你让我现在明白了它的一切。谢谢 – murielK

+0

不用担心;)请选择您最喜欢的答案作为接受的答案! – Dakkaron

+0

好吧,但如何做到这一点:(其我的第一篇文章可以引导我pleasE? – murielK

2

这两条线在问题实际上分裂短值为2倍字节的值。 如果您有短变量n = 0xCCDD, 行字节[i * 2] =(n & 0x00FF)将最低有效字节提取为bytes[i *2] 即ie。存储在0xDDbytes[i * 2]

行字节[I * 2 + 1] =(N >> 8),妈8个字节向右并给出最显著字节的在n 即值。以字节[i * 2 + 1]存储0xCC

查看http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html将有助于更好地理解它。

+0

感谢您的链接。我真的很感激 – murielK

2

位移仅仅是将1的位置移动到数字的表示中。例如:

0001101 // This is the binary representation of 13 
0011010 // This is 13 << 1, or 26, or 13 * 2 
0000110 // This is 13 >> 1, or 6, or floor(13/2) 

0110100 // 13 << 2 = 52 = 13 * 2^2 
1101000 // 13 << 3 = 104 = 13 * 2^3 

0000011 // 13 >> 2 = 3 = floor(13/2^2) 
0000001 // 13 >> 3 = 1 = floor(13/2^3) 

您对此感到困惑的另一行是“按位”和“ A & B结果与1 S IN的所有位置的数目,其中两个AB1 S:

1011010 // 90 
& 0000011 // & 3 
--------- // --- 
    0000010 // 2 
//  ^---- This is the only position where both 90 and 3 have a 1