2014-02-05 127 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