В длинном целом числе n поменять пары двоичных разрядов в зеркальном порядке - C (СИ)

Узнай цену своей работы

Формулировка задачи:

всем снова привет. есть задача: "в длинном целом числе N поменять пары двоичных разрядов в зеркальном порядке" то есть из числа 6969(1101100111001) должно получиться что-то около 3495(0110110100111). Вот то что у меня получилось:
#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);
}
На некоторых числах работает(506->327), а вот на числе приведенном выше вылезает другое число, отличное от ожидаемого ровно на 32. то есть западает самый центральный разряд. не знаю как с этим справится.. очень надеюсь на вашу помощь, потому как свой глаз уже как-то замылился и не вижу где именно ошибка.

Решение задачи: «В длинном целом числе 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;
}

Объяснение кода листинга программы

В этом коде выполняется следующие действия:

  1. Считывается число N (количество двоичных разрядов, которые необходимо поменять) с помощью функции scanf.
  2. Задаётся начальное значение переменной num равное 0.
  3. В цикле while считывается по одному двоичному разряду числа N и выполняется операция побитового исключающего OR с переменной num. Это приводит к тому, что в переменной num в соответствующем разряде меняется значение на противоположное.
  4. Число N сдвигается вправо на два разряда (чтобы пропустить прочитанный разряд).
  5. Переменная num сдвигается влево на два разряда (чтобы вставить прочитанный разряд).
  6. Цикл продолжается до тех пор, пока не будут прочитаны все разряды числа N.
  7. Переменная num сдвигается вправо на два разряда, чтобы удалить лишние нулевые разряды.
  8. Выводится значение переменной num с помощью функции printf.
  9. Функция main() возвращает 0, что означает успешное завершение работы программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.2 из 5
Похожие ответы