检索存储在int的某些位中的值

时间:2011-05-18 19:11:43

标签: java

我们划分了一个int来保存三个值。例如,前8位(从左到右)保持一个值,第8到第12位保持另一个值,其余位保持第三个值。

我正在编写一个实用程序方法来从int的某个位范围获取值。它够好吗?你有更好的解决方案吗? startBitPos和endBitPos从右到左计数。

public static int bitsValue(int intNum, int startBitPos, int endBitPos) 
{           
   //parameters checking ignored for now        
    int tempValue = intNum << endBitPos;
    return tempValue >> (startBitPos + endBitPos); 
}

修改

我确信所有价值观都不合格。

3 个答案:

答案 0 :(得分:9)

不,目前这不太正确:

  • 您应该使用无符号右移运算符,以避免在您不需要时使用负数结束。 (当然,假设原始值是无符号的。)
  • 你没有向左移动适当的数量以清除无关的高位。

我怀疑你想要:

// Clear unnecessary high bits
int tempValue = intNum << (31 - endBitPos);
// Shift back to the lowest bits
return tempValue >>> (31 - endBitPos + startBitPos);

就个人而言,我觉得使用面罩换挡比使用双换挡感觉更舒适,但我发现很难找到像上面那样短的东西。

答案 1 :(得分:1)

public static int bitsValue(int intNum, int startBitPos, int endBitPos) 
{           
    int mask = ~0; //or 0xffffffff
    //parameters checking ignored for now        
    mask = ~(mask<<(endBitPos)) & mask<<startBitPos
    return intNum & mask;
}

但是如果你有常用的比特率,那么最好为它们静态保留掩码

0xff000000 // is the 8 most significant bits  
0x00e00000 // is the next3 bits and  
0x001fffff // are the remaining 21 bits

答案 2 :(得分:0)

如果您只有几个固定长度的“面具”,您可以明确地存储它们并像这样使用它们:

int [] masks = new int [4];
int masks[0] = 0x11111111;
int masks[1] = 0x111100000000;
// ...

public int getValue(int input, int mask){
    return input & masks[i];
}