Понимание функции, которая инвертирует двоичное представление четного числа
Я недавно наткнулся на эту функцию, которая инвертирует двоичное представление четных чисел, но я не в состоянии понять логику кода?
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;
}