У меня 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;
}