Циклический сдвиг разрядов числа - C (СИ)
Формулировка задачи:
Здравствуйте, у меня есть программа
вы не могли бы помочь, объяснить часть программы:
Листинг программы
- /* ЗАДАНИЕ
- Выполнить циклический сдвиг в заданную пользователем сторону на некоторое
- количество разрядов в пределах определённой группы разрядов, количество
- которых и номер младшего разряда в группе задаются с клавиатуры.
- Для unsiged int.
- */
- //подключение библиотек
- #include <conio.h>
- #include <stdio.h>
- #include <conio.h>
- //главная функция
- void main()
- {
- unsigned int num; //данное число
- int low, count; //номер младшего разряда, количество разрядов группы
- int side, dist; //сторона сдвига, кол-во разрядов сдвига
- int i; //номер разряда
- unsigned int result; //результат - число
- //выводим заголовок, вводим данные
- clrscr();
- printf("ПРОГРАММА ВЫПОЛНЯЕТ ЦИКЛИЧЕСКИЙ СДВИГ.\n");
- printf("\n");
- printf("Введите число типа unsigned int: ");
- scanf("%u",&num);
- do{
- printf("Введите номер младшего разряда в группе (0..15): ");
- scanf("%u",&low);
- }while(low>15);
- do{
- printf("Введите количество разрядов группы (0..16): ");
- scanf("%u",&count);
- }while(low+count>16);
- do{
- printf("Выберите сторону: 1-влево, 2-вправо. ");
- scanf("%u",&side);
- }while(side!=1&&side!=2);
- do{
- printf("Введите количество разрядов сдвига (0..16): ");
- scanf("%u",&dist);
- }while(dist>16);
- //сдвиг вправо - это сдвиг влево на остальное количество разрядов
- if(side==2) dist=count-dist;
- printf("\n");
- //выводим все разряды числа
- printf("Число в двоичном виде: \t");
- for(i=15; i>=0; i--)
- printf("%u",(num>>i)&1);
- printf("\n");
- //обнуляем результат
- result=0;
- //цикл для каждого разряда исходного числа
- for(i=0; i<=15; i++){
- //номер разряда в результате
- int k=i;
- //если разряд входит в группу
- if(i>=low && i<low+count)
- //вычисляем новое место разряда в результате сдвига
- k=(((i-low)+dist)%count)+low;
- //если значение разряда = 1, то прибавляем новое значение к результату
- if(num&(1<<i))
- result+=(1<<k);
- }
- //выводим все разряды результата
- printf("Результат в двоичном виде: \t");
- for(i=15; i>=0; i--)
- printf("%u",(result>>i)&1);
- printf("\n");
- //выводим результат как число, ждём нажатие клавиши
- printf("Результат: %u.\n",result);
- getch();
- }
Листинг программы
- //обнуляем результат
- result=0;
- //цикл для каждого разряда исходного числа
- for(i=0; i<=15; i++){
- //номер разряда в результате
- int k=i;
- //если разряд входит в группу
- if(i>=low && i<low+count)
- //вычисляем новое место разряда в результате сдвига
- k=(((i-low)+dist)%count)+low;
- //если значение разряда = 1, то прибавляем новое значение к результату
- if(num&(1<<i))
- result+=(1<<k);
- }
Решение задачи: «Циклический сдвиг разрядов числа»
textual
Листинг программы
- typedef unsigned long ULI;
- /**
- * @brief This function is cyclically shift to the left
- * @param [in] Number which will be shifted
- * @param [in] on some bits
- * @return ULI (unsigned long int)
- */
- ULI ShiftLeft(const ULI number, const short digit)
- {
- return
- ( (number<<digit) |
- (number>>( (sizeof(ULI)<<3) - digit) ) );
- }
Объяснение кода листинга программы
В данном коде реализована функция ShiftLeft, которая выполняет циклический сдвиг числа на заданное количество бит.
- Тип данных ULI определен как unsigned long int, т.е. 32-битное беззнаковое целое число.
- Входные параметры функции:
- number - число, которое будет сдвинуто (смещение от начала числа)
- digit - количество бит, на которое будет выполнен сдвиг
- В функции используется операция сдвига на число бит, определяемое как (sizeof(ULI)<<3) - digit. Это выражение вычисляет размер числа ULI в байтах (32-битное число занимает 4 байта), затем сдвигает его на 3 байта вправо (чтобы получить количество бит) и вычитает значение digit.
- Результатом работы функции является число, полученное путем сдвига входного числа на digit бит влево и последующего объединения с оставшимися битами исходного числа.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д