В длинном целом числе n поменять пары двоичных разрядов в зеркальном порядке - C (СИ)
Формулировка задачи:
всем снова привет.
есть задача: "в длинном целом числе N поменять пары двоичных разрядов в зеркальном порядке"
то есть из числа 6969(1101100111001) должно получиться что-то около 3495(0110110100111). Вот то что у меня получилось:
На некоторых числах работает(506->327), а вот на числе приведенном выше вылезает другое число, отличное от ожидаемого ровно на 32. то есть западает самый центральный разряд. не знаю как с этим справится..
очень надеюсь на вашу помощь, потому как свой глаз уже как-то замылился и не вижу где именно ошибка.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void main(void)
{
unsigned long num,N,tmp;
int i,k,nBit,m;
unsigned long mask1, mask2;
num=i=k=nBit=0;
scanf("%lu", &N);
tmp = N;
while (N)
{
++nBit;
N>>=1;
}
N = tmp;
mask2=(int)(pow((double)2,nBit-1)+(int)pow((double)2,nBit-2));
mask1=(int)(pow((double)2,0)+(int)pow((double)2,1));
m=2;k=0;
for (i=0; i<nBit/2-1; i+=2)
{
k+=2;
num|=(N&mask2)>>(nBit-k);
num|=(N&mask1)<<(nBit-m);
mask1=mask1<<2;
mask2=mask2>>1;
m+=4;
}
printf("%lu", num);
}Решение задачи: «В длинном целом числе n поменять пары двоичных разрядов в зеркальном порядке»
textual
Листинг программы
int main()
{
unsigned long num=0,N;
scanf("%lu", &N);
while(N)
{
num^=(N&3);
N=N>>2;
num=num<<2;
}
num=num>>2;
printf("%lu", num);
return 0;
}
Объяснение кода листинга программы
В этом коде выполняется следующие действия:
- Считывается число N (количество двоичных разрядов, которые необходимо поменять) с помощью функции scanf.
- Задаётся начальное значение переменной num равное 0.
- В цикле while считывается по одному двоичному разряду числа N и выполняется операция побитового исключающего OR с переменной num. Это приводит к тому, что в переменной num в соответствующем разряде меняется значение на противоположное.
- Число N сдвигается вправо на два разряда (чтобы пропустить прочитанный разряд).
- Переменная num сдвигается влево на два разряда (чтобы вставить прочитанный разряд).
- Цикл продолжается до тех пор, пока не будут прочитаны все разряды числа N.
- Переменная num сдвигается вправо на два разряда, чтобы удалить лишние нулевые разряды.
- Выводится значение переменной num с помощью функции printf.
- Функция main() возвращает 0, что означает успешное завершение работы программы.