В длинном целом числе 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, что означает успешное завершение работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д