Понимание функции, которая инвертирует двоичное представление четного числа

Я недавно наткнулся на эту функцию, которая инвертирует двоичное представление четных чисел, но я не в состоянии понять логику кода?

int binaryReverse(int toReverse) {

     int reversed = 0;
     while(toReverse > 0) {
             reversed *= 2;
             reversed += toReverse % 2;
             toReverse /= 2;
     }

     return reversed;
}

1 ответ

Решение

Прежде всего, он не инвертирует биты, он инвертирует их (и только те, которые находятся между самым правым битом и самым левым битом, который установлен в 1).

Во-вторых, вот как это работает:

int binaryReverse(int toReverse)
{
    int reversed = 0;
    while (toReverse > 0)
    {
        reversed  *= 2;             // shift the output one bit to the left
        reversed  += toReverse % 2; // set the rightmost bit in the output to the value of the rightmost bit in the input
        toReverse /= 2;             // shift the input one bit to the right
    }
    return reversed;
}

В-третьих, здесь, возможно, более читаемая версия (хотя она должна принимать unsigned):

int binaryReverse(unsigned int toReverse)
{
    int reversed = 0;
    while (toReverse > 0)
    {
        reversed  <<= 1;             // shift the output one bit to the left
        reversed   |= toReverse & 1; // set the rightmost bit in the output to the value of the rightmost bit in the input
        toReverse >>= 1;             // shift the input one bit to the right
    }
    return reversed;
}
Другие вопросы по тегам