Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*Задание #4-D*/
- /*циклический сдвиг влево для беззнаковых положительных типов*/
- #include <stdio.h>
- //задание рабочего типа, может быть использован любой целочисленный тип
- typedef unsigned short Integer;
- //принимает на вход число, печатает его в двоичной записи с пробелами между байтами
- void printBinary(Integer x)
- {
- /*i, j - вспомогательные переменные для циклов
- base - вспомогательная переменная, два в какой-то целой степени
- bit - переменная, в которой один бит равен единицы, а остальные - нули,
- служит для "отщепления" очередного бита числа*/
- int i, j;
- int base = 1;
- //задаем base значение 2 ^ (n - 1), где n - число бит в числе x
- for (i = 0; i < 8 * sizeof(Integer) - 1; ++i)
- base *= 2;
- //пробегаем по всем разрядам слева направо
- for (i = 0; i < sizeof(Integer); ++i)
- {
- for (j = 0; j < 8; ++j)
- {
- //находим значение очередного бита - 0 или 1
- //соответственно выводим 0 или 1
- if (base & x)
- printf("1");
- else
- printf("0");
- base /= 2;
- }
- printf(" ");
- }
- printf("\n");
- }
- //циклически сдигаем число x на a байт влево
- Integer leftShift(Integer x, int a)
- {
- /*mask - так называемая маска, в данном случае число вида 11100...0,
- предназначенное для отделения первых a бит числа (в ней a единиц)
- carriage - перенос, первые a бит числа, которые будут перенесены из "левого угла" в "правый угол"
- tail - та часть числа, которая сдвигается без переноса
- base - вспомогательная переменная, два в какой-то целой степени
- a - величина сдвига, т.е. число переносимых разрядов,
- k - число сдвигаемых разрядов без переноса*/
- Integer carriage, tail;
- int base = 1, i, k = 8 * sizeof(Integer) - a;
- //если надо сдвинуть на 0, то можно ничего не делая, вернуть исходное значение
- if (a == 0)
- return x;
- //записываем в base 2^k (k - число байт минус величина сдвига)
- for (i = 0; i < k; ++i)
- base *= 2;
- //определяем переносимую часть числа
- carriage = x / base;
- //определяем "хвост", т.е. ту часть, которая сдвигается без переноса
- tail = x - carriage * base;
- //теперь сдвигаем ту часть числа, которая сдвигается без переноса на a влево
- for (i = 0; i < a; ++i)
- tail *= 2;
- //теперь осуществляем перенос
- tail += carriage;
- return tail;
- }
- int main()
- {
- /*в a будет записано число бит, на которое нужно сдвинуть число x;
- результат сдвига будет записан в переменной y*/
- Integer x, y;
- long z;
- int a;
- printf("Циклический сдвиг влево (%d-bit)", 8 * sizeof(Integer));
- //в цикле производим обработку введенных пользоватеолем данных
- do
- {
- //считывание данных
- printf("Введите числа: ");
- scanf("%d %d", &z, &a);
- x = (Integer)z;
- /*сдвиг на число всех разрядов не изменяет число, т.е. можно привести число a
- к промежутку от 0 до числа разрядов*/
- while (a < 0)
- a += 8 * sizeof(Integer);
- while (a > 8 * sizeof(Integer))
- a -= 8 * sizeof(Integer);
- //вывод считанного числа в шестнадцатеричной и двоичной записи
- printf("Вы ввели : %i = %x = ", x, x);
- printBinary(x);
- //определение сдвинутого числа
- y = leftShift(x, a);
- //вывод результата в шестнадцатеричной и двоичной записи
- printf("Результат : %i = %x = ", y, y);
- printBinary(y);
- } while (x != 0); //условие выхода из цикла - введен 0
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement