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

谢谢!

4

3 回答 3

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

然后将这些位移动到最低有效位以存储到abcd无符号位移位)中:

(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!
于 2013-06-13T00:39:27.847 回答
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;
  }
于 2013-06-13T00:43:04.693 回答
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);
于 2013-06-13T00:39:18.260 回答