2013-06-13 110 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; 
    }