Advertisement
Guest User

Untitled

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