Извлечение битов с помощью битовых манипуляций - PullRequest
2 голосов
/ 16 сентября 2011

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

Ответы [ 2 ]

2 голосов
/ 16 сентября 2011

Осторожно, непроверенный код:

for(i = 0; i < count; i++) 
{
    bitmask = 1 << positions[i];
    bit = (bytes & bitmask)!=0;
    result = (result << 1)|bit;
}
1 голос
/ 16 сентября 2011

Поскольку вы отбираете отдельные биты, нет причин делать битовую маску переменной; просто сдвиньте нужный бит в бит единиц и используйте маску 1. Например ::1001*

...
result = (2*result) | ((bytes >> positions[i]) & 1);
...

Многие компиляторы генерируют один и тот же код для 2*result и result<<1, поэтому используйте любой, который вам нравится.

Обратите внимание: если вы разрабатываете интерфейс и у вас нет веских оснований для использования short целых чисел для positions[] и count, как у вас, то не делайте этого. Будьте последовательны и указывайте все целые числа одинаково.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...