Advertisement
Guest User

Untitled

a guest
Jun 23rd, 2017
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.87 KB | None | 0 0
  1. /*Задание #4-D*/
  2. /*циклический сдвиг влево для беззнаковых положительных типов*/
  3.  
  4. #include <stdio.h>
  5.  
  6. //задание рабочего типа, может быть использован любой целочисленный тип
  7. typedef unsigned short Integer;
  8.  
  9. //принимает на вход число, печатает его в двоичной записи с пробелами между байтами
  10. void printBinary(Integer x)
  11. {
  12. /*i, j - вспомогательные переменные для циклов
  13. base - вспомогательная переменная, два в какой-то целой степени
  14. bit - переменная, в которой один бит равен единицы, а остальные - нули,
  15. служит для "отщепления" очередного бита числа*/
  16. int i, j;
  17. int base = 1;
  18.  
  19. //задаем base значение 2 ^ (n - 1), где n - число бит в числе x
  20. for (i = 0; i < 8 * sizeof(Integer) - 1; ++i)
  21. base *= 2;
  22.  
  23. //пробегаем по всем разрядам слева направо
  24. for (i = 0; i < sizeof(Integer); ++i)
  25. {
  26. for (j = 0; j < 8; ++j)
  27. {
  28. //находим значение очередного бита - 0 или 1
  29. //соответственно выводим 0 или 1
  30. if (base & x)
  31. printf("1");
  32. else
  33. printf("0");
  34. base /= 2;
  35. }
  36. printf(" ");
  37. }
  38.  
  39. printf("\n");
  40. }
  41.  
  42. //циклически сдигаем число x на a байт влево
  43. Integer leftShift(Integer x, int a)
  44. {
  45. /*mask - так называемая маска, в данном случае число вида 11100...0,
  46. предназначенное для отделения первых a бит числа (в ней a единиц)
  47. carriage - перенос, первые a бит числа, которые будут перенесены из "левого угла" в "правый угол"
  48. tail - та часть числа, которая сдвигается без переноса
  49. base - вспомогательная переменная, два в какой-то целой степени
  50. a - величина сдвига, т.е. число переносимых разрядов,
  51. k - число сдвигаемых разрядов без переноса*/
  52.  
  53. Integer carriage, tail;
  54. int base = 1, i, k = 8 * sizeof(Integer) - a;
  55.  
  56. //если надо сдвинуть на 0, то можно ничего не делая, вернуть исходное значение
  57. if (a == 0)
  58. return x;
  59.  
  60. //записываем в base 2^k (k - число байт минус величина сдвига)
  61. for (i = 0; i < k; ++i)
  62. base *= 2;
  63.  
  64. //определяем переносимую часть числа
  65. carriage = x / base;
  66.  
  67. //определяем "хвост", т.е. ту часть, которая сдвигается без переноса
  68. tail = x - carriage * base;
  69.  
  70. //теперь сдвигаем ту часть числа, которая сдвигается без переноса на a влево
  71. for (i = 0; i < a; ++i)
  72. tail *= 2;
  73.  
  74. //теперь осуществляем перенос
  75. tail += carriage;
  76.  
  77. return tail;
  78. }
  79.  
  80. int main()
  81. {
  82. /*в a будет записано число бит, на которое нужно сдвинуть число x;
  83. результат сдвига будет записан в переменной y*/
  84. Integer x, y;
  85. long z;
  86. int a;
  87.  
  88. printf("Циклический сдвиг влево (%d-bit)", 8 * sizeof(Integer));
  89.  
  90. //в цикле производим обработку введенных пользоватеолем данных
  91. do
  92. {
  93. //считывание данных
  94. printf("Введите числа: ");
  95. scanf("%d %d", &z, &a);
  96. x = (Integer)z;
  97. /*сдвиг на число всех разрядов не изменяет число, т.е. можно привести число a
  98. к промежутку от 0 до числа разрядов*/
  99. while (a < 0)
  100. a += 8 * sizeof(Integer);
  101. while (a > 8 * sizeof(Integer))
  102. a -= 8 * sizeof(Integer);
  103. //вывод считанного числа в шестнадцатеричной и двоичной записи
  104. printf("Вы ввели : %i = %x = ", x, x);
  105. printBinary(x);
  106. //определение сдвинутого числа
  107. y = leftShift(x, a);
  108. //вывод результата в шестнадцатеричной и двоичной записи
  109. printf("Результат : %i = %x = ", y, y);
  110. printBinary(y);
  111. } while (x != 0); //условие выхода из цикла - введен 0
  112.  
  113. return 0;
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement