我有一个32位无符号整数,我需要在给定位置提取位并从这些位中生成一个新数字。例如,如果我有一个0xFFFFFFFF并且想要位0,10,11,那么我的结果将是7(111b)。
这是我的尝试,它正确提取位但不能创建正确的结果。我将结果向左移动了1个位置并将其与我提取的位置进行运算,看起来这是不正确的吗?
我也确定可能有更优雅的方法来做到这一点?
#define TEST 0xFFFFFFFF
unsigned int extractBits(unsigned short positions[], unsigned short count, unsigned int bytes)
{
unsigned int result = 0;
unsigned int bitmask = 0;
unsigned short bit = 0;
int i = 0;
for(i = 0; i < count; i++) {
bitmask = 2 << (positions[i] -1);
if(bitmask == 0) bitmask = 1;
bit = bytes & bitmask;
bit = bit >> positions[i];
result = result << 1;
result = result & bit;
}
if(result != 31) {
printf("FAIL");
}
return result;
}
int main(void)
{
unsigned short positions[5] = {8, 6, 4, 2, 0};
unsigned int result = extractBits(positions, 5, TEST);
printf("Result: %d\n", result);
return 0;
}
答案 0 :(得分:2)
小心,未经测试的代码:
for(i = 0; i < count; i++)
{
bitmask = 1 << positions[i];
bit = (bytes & bitmask)!=0;
result = (result << 1)|bit;
}
答案 1 :(得分:1)
由于您要选择单个位,因此没有理由将位掩码变为变量;只需将所需的位移入单位位,然后使用1的掩码。例如:
...
result = (2*result) | ((bytes >> positions[i]) & 1);
...
许多编译器为2*result
和result<<1
生成相同的代码,因此请根据您的喜好使用。
注意,如果您正在设计界面,并且没有充分的理由像{J} {}和short
一样使用positions[]
整数,那么请不要这样做。保持一致并以相同的方式指定所有整数。