Как прочитать обратное число из двоичного файла? - PullRequest
1 голос
/ 30 мая 2019

Я хотел бы прочитать 32-битное число из двоичного файла на C. Проблема в том, что порядок битов обратный.Для примера 3 цифры номер 110 будет означать 3, а не 6. В начале у нас есть младший значащий бит (2 ^ 0), затем 2 ^ 1 и так далее.Есть ли простой способ сделать это в C, или мне нужно написать всю логику самостоятельно (прочитать первый бит, умножить его на 2 ^ 0, добавить к сумме, повторить до конца)?

1 Ответ

2 голосов
/ 30 мая 2019

у вас есть много возможных способов:

Портативный:

(не мой алгоритм)

uint32_t rev(uint32_t x)
{
    x = (((x & 0xaaaaaaaa) >> 1) | ((x & 0x55555555) << 1));
    x = (((x & 0xcccccccc) >> 2) | ((x & 0x33333333) << 2));
    x = (((x & 0xf0f0f0f0) >> 4) | ((x & 0x0f0f0f0f) << 4));
    x = (((x & 0xff00ff00) >> 8) | ((x & 0x00ff00ff) << 8));
    return((x >> 16) | (x << 16));
}

или

uint32_t bit_reverse_4bytes(uint32_t x)
{
    x = ((x & 0xF0F0F0F0) >> 4) | ((x & 0x0F0F0F0F) << 4);
    x = ((x & 0xCCCCCCCC) >> 2) | ((x & 0x33333333) << 2);
    return ((x & 0xAAAAAAAA) >> 1) | ((x & 0x55555555) << 1);
}

Наивный

uint32_t naiverevese(uint32_t x)
{
    uint32_t result = 0;
    for(int i = 0; i < 32; i++)
    {
        result |= x & 1;
        result <<=1;
        x >>= 1;
    }
    return result;
}

или справочная таблица.

Не переносимый, но самый эффективный:

Для многих процессоров есть специальные инструкции, например:

ARM - rbit и собственный unsigned int __rbit(unsigned int val)

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