2013-06-13 126 views
1

某些位我有一個二進制數,看起來像這樣:提取二進制數據

00000000 00000000 00000011 00001101 = 781 integer value = integer name "packed" 

我怎麼能提取的每一個作爲單獨的整數值在Java中使用逐位的。像下面這樣:

int a = (function) = 00000000; 
int b = (function) = 00000000; 
int c = (function) = 00000011; 
int d = (function) = 00001101; 

如果你能看到我在做什麼在那裏..我想第8成一個整數下入第二整數等等..我你使用逐位本想在Java中,但我完全不確定。任何幫助表示讚賞。對不起,但我對這種事情完全陌生,真的需要幫助,謝謝!基本上(功能)應該等於這樣的東西:

packed >> 5; (I know this isn't nearly right that is why i am needing help on this)... 

謝謝!

回答

5

你是正確的,這裏需要的位操作。

首先,使用面具只有你感興趣的位隔離,把所有其他位關閉:

value & 0xFF000000 // isolate most significant 8 bits 
value & 0x00FF0000 // isolate next 8 bits 
value & 0x0000FF00 // isolate next 8 bits 
value & 0x000000FF // isolate least significant 8 bits 

隨後位到至少顯著位轉移到存儲到abc,和d(一個無符號位位移):

(value & 0xFF000000) >>> 24 // Shift bits 24-31 to bits 0-7 
(value & 0x00FF0000) >>> 16 // Shift bits 16-23 to bits 0-7 
(value & 0x0000FF00) >>> 8 // Shift bits 8-15 to bits 0-7 
(value & 0x000000FF)  // No need to shift the last one! 
3

嘗試是這樣的:

public byte getNthByte(int n, int packed) { 
    // shift the desired bits into the last 8 bits 
    int shifted = packed >> (8 * n); 
    // and now get those bits 
    int masked = 0x000000FF & shifted; 
    return masked; 
} 

然後

int a = getNthByte(3); 
int b = getNthByte(2); 
int c = getNthByte(1); 
int d = getNthByte(0); 
4

這是可以實現通過使用掩碼執行按位與運算,然後進行位移。掩碼只是一個數字,其中您不感興趣的所有位都設置爲零。它面具你不關心的位。

int BYTE_ONE_MASK = 0xFF; 
int BYTE_TWO_MASK = 0xFF00; 
int BYTE_THREE_MASK = 0xFF0000; 
int BYTE_FOUR_MASK = 0xFF000000; 

的位移是必要的比至少其它所有字節顯著之一:

int a = (val & BYTE_ONE_MASK); 
int b = (val & BYTE_TWO_MASK) >> 8; 
int c = (val & BYTE_THREE_MASK) >> 16; 
int d = (val & BYTE_FOUR_MASK) >> 24; 

這可以被概括爲一個函數,如下所示:

// Assuming the first byte is n = 0. 
    public static int getByte(int val, int n) { 
    int shift = n * 8; 
    int mask = 0xFF << shift; 
    return (val & mask) >> shift; 
    }