Циклический сдвиг разрядов числа - C (СИ)

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

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

Здравствуйте, у меня есть программа
Листинг программы
  1. /* ЗАДАНИЕ
  2. Выполнить циклический сдвиг в заданную пользователем сторону на некоторое
  3. количество разрядов в пределах определённой группы разрядов, количество
  4. которых и номер младшего разряда в группе задаются с клавиатуры.
  5. Для unsiged int.
  6. */
  7. //подключение библиотек
  8. #include <conio.h>
  9. #include <stdio.h>
  10. #include <conio.h>
  11. //главная функция
  12. void main()
  13. {
  14. unsigned int num; //данное число
  15. int low, count; //номер младшего разряда, количество разрядов группы
  16. int side, dist; //сторона сдвига, кол-во разрядов сдвига
  17. int i; //номер разряда
  18. unsigned int result; //результат - число
  19. //выводим заголовок, вводим данные
  20. clrscr();
  21. printf("ПРОГРАММА ВЫПОЛНЯЕТ ЦИКЛИЧЕСКИЙ СДВИГ.\n");
  22. printf("\n");
  23. printf("Введите число типа unsigned int: ");
  24. scanf("%u",&num);
  25. do{
  26. printf("Введите номер младшего разряда в группе (0..15): ");
  27. scanf("%u",&low);
  28. }while(low>15);
  29. do{
  30. printf("Введите количество разрядов группы (0..16): ");
  31. scanf("%u",&count);
  32. }while(low+count>16);
  33. do{
  34. printf("Выберите сторону: 1-влево, 2-вправо. ");
  35. scanf("%u",&side);
  36. }while(side!=1&&side!=2);
  37. do{
  38. printf("Введите количество разрядов сдвига (0..16): ");
  39. scanf("%u",&dist);
  40. }while(dist>16);
  41. //сдвиг вправо - это сдвиг влево на остальное количество разрядов
  42. if(side==2) dist=count-dist;
  43. printf("\n");
  44. //выводим все разряды числа
  45. printf("Число в двоичном виде: \t");
  46. for(i=15; i>=0; i--)
  47. printf("%u",(num>>i)&1);
  48. printf("\n");
  49. //обнуляем результат
  50. result=0;
  51. //цикл для каждого разряда исходного числа
  52. for(i=0; i<=15; i++){
  53. //номер разряда в результате
  54. int k=i;
  55. //если разряд входит в группу
  56. if(i>=low && i<low+count)
  57. //вычисляем новое место разряда в результате сдвига
  58. k=(((i-low)+dist)%count)+low;
  59. //если значение разряда = 1, то прибавляем новое значение к результату
  60. if(num&(1<<i))
  61. result+=(1<<k);
  62. }
  63. //выводим все разряды результата
  64. printf("Результат в двоичном виде: \t");
  65. for(i=15; i>=0; i--)
  66. printf("%u",(result>>i)&1);
  67. printf("\n");
  68. //выводим результат как число, ждём нажатие клавиши
  69. printf("Результат: %u.\n",result);
  70. getch();
  71. }
вы не могли бы помочь, объяснить часть программы:
Листинг программы
  1. //обнуляем результат
  2. result=0;
  3. //цикл для каждого разряда исходного числа
  4. for(i=0; i<=15; i++){
  5. //номер разряда в результате
  6. int k=i;
  7. //если разряд входит в группу
  8. if(i>=low && i<low+count)
  9. //вычисляем новое место разряда в результате сдвига
  10. k=(((i-low)+dist)%count)+low;
  11. //если значение разряда = 1, то прибавляем новое значение к результату
  12. if(num&(1<<i))
  13. result+=(1<<k);
  14. }

Решение задачи: «Циклический сдвиг разрядов числа»

textual
Листинг программы
  1. typedef unsigned long ULI;
  2. /**
  3.  * @brief   This function is cyclically shift to the left
  4.  * @param   [in]    Number which will be shifted
  5.  * @param   [in]    on some bits
  6.  * @return  ULI (unsigned long int)
  7.  */
  8. ULI ShiftLeft(const ULI number, const short digit)
  9. {
  10.     return
  11.         ( (number<<digit) |
  12.           (number>>( (sizeof(ULI)<<3) - digit) ) );
  13. }

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

В данном коде реализована функция ShiftLeft, которая выполняет циклический сдвиг числа на заданное количество бит.

  1. Тип данных ULI определен как unsigned long int, т.е. 32-битное беззнаковое целое число.
  2. Входные параметры функции:
    • number - число, которое будет сдвинуто (смещение от начала числа)
    • digit - количество бит, на которое будет выполнен сдвиг
  3. В функции используется операция сдвига на число бит, определяемое как (sizeof(ULI)<<3) - digit. Это выражение вычисляет размер числа ULI в байтах (32-битное число занимает 4 байта), затем сдвигает его на 3 байта вправо (чтобы получить количество бит) и вычитает значение digit.
  4. Результатом работы функции является число, полученное путем сдвига входного числа на digit бит влево и последующего объединения с оставшимися битами исходного числа.

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


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

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

10   голосов , оценка 4.4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы