Теория:
Умножение и деление
Умножение и деление можно свести к операциям сложения и сложения с дополнительным кодом числа.
Пример \(4\)
Выполни умножение \(A\) и \(B\) в восьмиразрядной сетке.
Пусть \(A = 23\), \(B = 5\).
1. Получим прямой код чисел \(A\) и \(B\) в восьмиразрядной сетке.
2. ; .
3. Выполним поразрядное умножение.
4. Проанализируем полученный результат. Переполнения в старшем разряде восьмиразрядной сетки не произошло. Результат верен. Вычисления в десятичной системе счисления его подтверждают. Кроме того, видно, что умножение сводится к сложению и сдвигу содержимого первого сомножителя на один разряд, если во втором сомножителе в разряде \(1\), и к пропуску разряда, если во втором сомножителе \(0\).
Ответ:
Умножение отрицательных чисел выполняется по тем же правилам с учётом того, что отрицательные числа хранятся в дополнительном коде.
Пример \(5\)
Выполни умножение \(A\) и \(B\) в восьмиразрядной сетке.
Пусть \(A = -19\), \(B = 6\).
1. Получим прямой код числа \(B\) в восьмиразрядной сетке:
.
2. Получим дополнительный код числа \(A\) в восьмиразрядной сетке:
3. Выполним поразрядное умножение.
4. Проанализируем полученный результат. Единица в старшем разряде восьмиразрядной сетки обозначает, что получен дополнительный код отрицательного числа. Это верно. Отнимем от полученного результата единицу и инвертируем его:
;
5. Вычисления в десятичной системе счисления подтверждают полученный результат.
Ответ:
Для объяснения операции деления подберём числа так, чтобы результат получался целым числом. А о вещественных числах мы поговорим в другом разделе.
Пример \(6\)
Выполни деление \(A\) на \(B\) в восьмиразрядной сетке.
Пусть \(A = 45\), \(B = 9\).
1. Получим прямой код числа \(A\) в восьмиразрядной сетке:
.
2. Получим дополнительный код числа \(B\) в восьмиразрядной сетке:
3. Выполним последовательное сложение:
4. Проанализируем полученный результат. Деление свелось к сложению делимого и дополнительного кода делителя. Частное равно количеству операций сложения до достижения нулевого результата. Вычисления в десятичной системе счисления подтверждают полученный результат.
Ответ: .
Практически операция умножения реализуется как алгоритм известного «русского» метода умножения, также основанного на операциях сдвига и определения чётности результата (двоичное число, оканчивающееся на \(1\), — нечётное, оканчивающееся на \(0\) — чётное).
Например, перемножим \(45\) и \(33\):
Результат равен сумме чисел первого столбца, которые умножаются на нечётные числа второго столбца: \(45 + 1440 = 1485\).
Сравнение
Операции сравнения для чисел со знаком и без знака выполняются по-разному. Для примера возьмём три машинных кода чисел \(A\), \(B\), \(C\).
Пример \(7\)
Пусть
Расставь числа, коды которых приведены в задании, в порядке возрастания. Запиши числа друг за другом без пробелов и разделительных знаков.
1. Определим знак чисел \(A\), \(B\), \(C\).
(в знаковом разряде — \(1\));
(в знаковом разряде — \(0\));
(в знаковом разряде — \(0\)).
2. Так как \(A\) — число отрицательное, а \(C\) и \(B\) — положительные, сделаем первый вывод, что \(A\) — наименьшее.
3. Сравним положительные числа \(C\) и \(B\) — единица в более старшем разряде в числе \(C\) гарантирует, что это число больше.
Следовательно, \(A < B < C\).
Ответ: \(ABC\).
Пример \(8\)
Пусть
Расставь числа, коды которых приведены в задании, в порядке возрастания. Запиши числа друг за другом без пробелов и разделительных знаков.
1. Определим знак чисел \(A\), \(B\), \(C\).
(в знаковом разряде — \(0\));
(в знаковом разряде — \(1\));
(в знаковом разряде — \(1\)).
2. Так как \(A\) — число положительное, а \(C\) и \(B\) — отрицательные, сделаем первый вывод, что \(A\) — наибольшее.
3. Сравним отрицательные числа \(C\) и \(B\). Оба числа хранятся в дополнительном коде. Можно воспользоваться ранее разобранным алгоритмом перехода от дополнительного кода к прямому: отнять \(1\), инвертировать число (см. Примечание). А можно применить другой подход, основанный на том, что дополнительный код — дополнение до переполненной разрядной сетки. То есть для получения модуля этих чисел достаточно вычесть их значение из переполненной разрядной сетки. Для \(16\)-разрядной сетки это число — \(1 0000 0000 0000 0000\), или в шестнадцатеричном коде — \(10000\). Проведём вычитание.
Так как число \(C\) по абсолютной величине больше, то с отрицательным знаком оно будет меньше (сравни: \(5 > 3\), но \(-5 < -3\)).
Отсюда \(C < B < A\).
Ответ: \(CBA\).
Примечание:
Практически операции сравнения реализуются с помощью вычитания. Равенство — сравнение разности каждого из чисел с машинным нулём. Неравенство — анализ значения самого левого бита разности.
Поразрядные логические операции
Применительно к устройствам компьютера рассматриваемые нами арифметические операции реализуются с помощью основных логических операций: И, ИЛИ, НЕ. Применение этих операций к двоичному представлению кодов чисел называется сбросом и установкой. А константа, с помощью которой применяется логическая операция к многоразрядным числам, называется маской.
Так, например, с помощью операции И можно выполнить операцию сброса указанных битов.
В этом примере сброшены все биты, кроме старшего.
С помощью операции ИЛИ можно выполнить поразрядное сложение битов числа.
Здесь, кроме примера а), везде выполнена операция установки.
Обрати внимание, что перенос в следующий разряд в случае поразрядного сложения невозможен.
Рассмотрим ещё одну логическую операцию, участвующую в формировании числовых кодов чисел. Операция исключающее ИЛИ, другое обозначение — XOR, а также ещё одно обозначение — .
Таблица истинности этой логической функции.
С помощью этой операции можно выполнить инверсию единичных битов. Часто операцию используют для обнуления переменной или для шифрования данных.
Правильно подобранная маска позволяет сбрасывать и устанавливать, то есть преобразовывать любые биты исходного числа.
Пример \(9\)
Обрати внимание: при единичной маске мы получили обратный код исходного числа. Примени эту маску ещё раз.
Получили исходное число.