我们划分了一个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);
}
修改
我确信所有价值观都不合格。
答案 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];
}