Операции над двоичными числами.
При сложении двух единиц происходит перенос из данного разряда в следующий, более старший разряд, а при вычитании в двоичном разряде единицы из нуля происходит заем в данным разряд из более старшего разряда, в результате в данном разряде устанавливается единица.
Рассмотрим сложение двоичных эквивалентов десятичных чисел 99 и 27, т.е. 01100011 и 00011011.
0000011 разряды переноса
01100011 первое слагаемое
+
00011011 второе слагаемое
011111102=12610 сумма 0 · 20 + 1 · 21 + 1 · 22 …
Аналогично происходит сложение шестнадцатеричных чисел, например:
0101 Десятичное Шестнадцатеричное Перенос
0007 представление представление
+
640В
7112 7 + 11 = 18, 18 – 16 = 2 1
0 + 0 + 1 = 1 1 0
13 + 4 = 17 17 – 16 = 1 1
0 + 6 + 1 =7 7 0
Рассмотрим пример вычитания двоичных чисел.
0 остаток после заема
10110 уменьшаемое
-
01100 вычитаемое
01010 разность
Двоичное вычитание начинается операцией над значениями крайних справа двоичных разрядов уменьшаемого и вычитаемого. Далее операция повторяется применительно к соседним (второму и третьему разрядам). При вычитании в первых трех разрядах заем не требуется. Однако при вычитании значения четвертого разряда вычитаемого (1) из значения одноименного разряда уменьшаемого (0) требуется заем единицы из пятого разряда уменьшаемого, при этом результат вычитания равен 1. Произведенный заем приводит к изменению значения пятого разряда уменьшаемого (единица заменяется нулем). В данном примере в последнем разряде находятся незначащие нули, но и в этом случае необходимо выполнить операцию вычитания, поскольку мы оперировали 5-разрядными двоичными числами.
|
|
Аналогично вычитаются шестнадцатеричные числа.
Пример:
3А остаток после заема
4В86F уменьшаемое
_
2D948 вычитаемое
1DF27 разность
Десятичное Шестнадцатеричное Заем
представление число _____
15 – 8 = 7 7 0
6 – 4 = 2 2 0
16 + 8 – 9 = 15 F 1
|
|
16 + 10 – 13 = 13 D 1
3 – 2 = 1 1
Рассмотрим пример умножения двоичных чисел путем сдвига и сложения. Основные правила этого способа:
1. Формирование первого частичного произведения. Если значение младшего значащего разряда множителя равно 0, то и результат равен 0, если значение этого разряда равно 1, то результат является копией множимого.
2. Правило сдвига. При использовании очередного разряда множителя для формирования частичного произведения производится сдвиг множимого на один разряд влево.
3. Правило сложения. Каждый раз, когда значение разряда множителя равно 1, к результату необходимо прибавить множимое, расположенное в позиции, определенной правилом сдвига.
4. Определение результирующего произведения. Искомое произведение есть результат выполнения всех операций сдвига и сложения.
Приведем пример умножения двоичных чисел по приведенному выше алгоритму.
11011 множимое 2710
х
01100 множитель 1210
|
|
00000 первое частичное произведение
0000 второе частичное произведение
11011 третье частичное произведение
11011 четвертое частичное произведение
101000100 результат (32410)
Заметим, что для получения результата при умножении n-разрядных чисел понадобится 2n-разрядное двоичное число.
Вопрос 8
Представление отрицательных чисел позиционных систем счисления.
При выполнении арифметических операций средствами «двоичной электроники» возникает проблема идентификации отрицательных чисел. Одним из приемлемых решений является представление знака числа в специальном знаковом разряде S (самый старший разряд поля представления двоичного числа).
Изображение знака «+» в этом разряде принято кодировать цифрой 0, а знака “-“ – цифрой 1 – для двоичной, 9 – для десятичной, F – для шестнадцатеричной системы счисления.
Если цифровая часть положительных и отрицательных чисел содержит всегда абсолютную величину числа, то такой способ представления знаковых чисел называют прямым кодом: такой код приводит к появлению двух представлений нуля: +0 и –0 (например, для дробных двоичных чисел +0 = 0; -0 =1, 00 … 00).
|
|
В МПТ (микропроцессорной технике) для обработки знаковых чисел используются, в основном, дополнительные коды, в качестве промежуточных – обратные.
Обратный код двоичного отрицательного числа формируется заменой всех нулей числа на единицы, а всех единиц на нули (дополнение).
Например, с помощью 8-разрядного двоичного числа в обратном коде можно представить следующие десятичные числа:
положительные отрицательные
знаковый разряд
↓ + ↓-
00000000 +0 -0 11111111
00000001 +1 -1 11111110
00000010 +2 -2 11111101
…………………………………………………..
01111111 +127 -127 10000000
Правило формирования обратного кода простое, однако, работа с обратными кодами вызывает затруднения, например, остается двусмысленность представления нулевого результата. Поэтому используется дополнительный код, который получается путем добавления единицы к обратному коду числа (дополнение до 2).
В табл. 1 приведены десятичные эквиваленты 8-разрядных двоичных чисел, которые позволяют сделать вывод, что в дополнительном коде существует единственное представление нуля и одно особое отрицательное число (-12810), не имеющее дополнительного к нему положительного числа.
Таблица 1
Десятичные эквиваленты двоичных чисел
8-разрядное двоичное число
| Десятичный эквивалент | |
Двоичного числа со знаком (отрицательное число в дополнительном коде) | Двоичного числа без знака | |
00000000 00000001 00000010 00000011 : 01111110 01111111 10000000 10000001 10000010 : 11111101 11111110 11111111 | +0 +1 +2 +3 : +126 +127 -128 -127 -126 : -3 -2 -1 | 0 1 2 3 : 126 127 128 129 130 : 253 254 255 |
Использование дополнительного кода позволяет заменить операцию вычитания операцией сложения уменьшаемого дополнительным кодом вычитаемого. Это существенно упрощает аппаратную реализацию подобных операций в микропроцессоре. Однако следует не упускать из виду, с какими числами вы имеете дело в данный момент: без знака или со знаком.
В общем случае при сложении или вычитании чисел со знаком результат есть число со знаком; если при этом бит старшего разряда равен единице, то результат – отрицательное число в дополнительном коде. Если требуется определить абсолютное значение результата, последний необходимо представить в обратном коде, а затем прибавить единицу.
Проиллюстрируем операции вычитания следующими примерами.
Пример 1. Вычислить разность чисел 15-6.
1111111 разряды переноса
00001111 уменьшаемое 1510
+
11111110 дополнительный код вычитаемого 610
100001001 результат 910
опускаемая единица переноса
Пример 2. Вычислить разность чисел 26-34:
00011100 число 2810
+
11011110 дополнительный код числа - 3410
11111010 разность в форме дополнения отрицательная
(поскольку в старшем разряде 1).
Определим абсолютное значение разности.
11111010 дополнительный код разности
00000101 обратный код
+
00000001 единица, добавляемая к обратному коду
00000110 абсолютное значение разности (610)
Ответ: 28
-
34
-6
Пример 3. Из числа –0, 5, 0 вычесть число 0, 4, 0
1.011 дополнительный код числа –0,5
+ 1.100 дополнительный код числа –0,4
10.111 переполнение разрядной сетки
(ошибка переполнения)
Как видно из примеров 1 и 3, при работе с ограниченной разрядной сеткой необходимо следить за ошибкой переполнения.
Учет переполнения микропроцессорными средствами ведется автоматически.
Обозначим: Р0 = 1 – событие переноса единицы из старшего значащего разряда числа в знаковый разряд; Р1 = 1 перенос единицы из знакового разряда. Тогда признак переполнения V=1 определяется по логике «исключающее ИЛИ»: V=P0+P1.
Двоичное деление.
Деление – это операция, обратная умножению. Иначе говоря, при делении операцию вычитания повторяют до тех пор, пока уменьшаемое не стане меньше вычитаемого. Число этих повторений показывает, сколько раз вычитаемое укладывается в уменьшаемом.
Умножение как последовательность повторяющихся операций сложения и деление как последовательность повторяющихся операций вычитания можно проиллюстрировать на следующих примерах:
Умножение Деление
7 х 5 = ? 35 : 7 = ?
0 35
+ _
7 1 7 1
7 28
+ _
7 2 7 2
14 21
+ _
7 3 7 3
21 14
+ _
7 4 7 4
28 7
+ _
7 5 7 5
35 0
Пять последовательных операций сложения числа 7 дает в результате число 35, а при выполнении пяти последовательных операций вычитания числа 7 из числа 35 получается 0.
Процедура деления несколько сложнее процедуры умножения. Рассмотрим, например, деление числа 20410 на число 1210, пользуясь правилами десятичной и двоичной арифметик:
Десятичное деление Двоичное деление
204 1100 1100
12 1100
84 01
84 0
0 011
0
110
0
1100
1100
0
Процедура десятичного деления нам знакома и начинается с анализа делимого (204) и делителя (12). Мы обнаруживаем, что число 12 «укладывается в числе 20 только один раз, поскольку остаток (8) меньше делителя (12). Объединяя остаток со следующей цифрой делимого, получаем число 84 и снова определяем, сколько раз делитель (12) укладывается в 84. Результатом деления является частное, равное 17.
Двоичное деление также начинается с анализа делимого (1100 1100) и делителя (1100). Сразу же обнаруживаем, что делитель (1100) точно укладывается в 1100, а поэтому записываем цифру 1 в поле, предоставленное для формирования частного. Умножаем делитель на 1 и вычитаем результат из 1100. Разность равна 0, она меньше делителя, а потому процесс деления можно продолжить. Объединяем часть остатка со значением следующего разряда делимого, равным 1. Поскольку делитель (1100) укладывается 0 раз в числе…. Записываем 0 в поле представления частного, а число 1 объединяем со следующей цифрой делимого и т.д. Описываемая процедура продолжается до тех пор, пока делимое не оказывается исчерпанным.
Из рассмотренного выше следует, что реализовать операцию деления в вычислительной машине не столь просто, как операцию умножения. Слишком много усилий требуется для выяснения того, сколько раз делитель укладывается в определенном числе. Несмотря на указанные затруднения, был разработан несложный способ двоичного деления, используемый в микропроцессорах.
Процедура двоичного деления в действительности проста, потому что каждый бит частного принимает одно из двух возможных значений: 1 или 0. Как и в случае двоичного умножения, удобным оказывается использование операции сдвига. Продемонстрируем упомянутый способ двоичного деления на рассмотренном выше примере, предварительно представив делитель (12) в дополнительном коде. Это позволит ограничиться двоичным сложением во всех случаях, когда нужно выполнить сложение или вычитание. Дополнительный код двоичного представления числа 1210 определяется следующим образом:
01100 Двоичное представление числа 12
10011 Обратный код двоичного представления числа 12
00001 Единица, добавляемая к обратному коду
_____
1 0100 Дополнительный код числа 12 (т.е. число 12)
↑ ↑
… знака Биты абсолютной величины.
Теперь можно приступить к собственно делению. Как и в случае выше рассмотренного так называемого длинного двоичного деления, необходимо определить, сколько раз делитель укладывается в числе, образованном соответствующим количеством старших значащих битов делимого.
Микропроцессор начинает вычитать делитель из этого числа. Если делитель не будет укладываться в упомянутой части делимого, всегда можно вернуть вычтенные биты обратно делимому. О том, что делитель не укладывается, свидетельствует появление отрицательного результата вычитания (бит знака разности равен 1).
Предпримем попытку выполнить вычитание первый раз:
011001100 Делимое
101000000 Вычитаемое число 1210
000001100 Первый результат
↑
Наличие здесь нуля
означает, что 1-й бит
искомого частного
равен 1 Частное: 1ХХХХ
Если делитель укладывается в соответствующую часть делимого, бит знака равен 0. Это означает, что результат деления – положительное число. В данном примере это оказалось именно так. А поэтому первый бит искомого результата (частного) равен 1.
Выполним второй шаг процедуры деления. Следует еще раз попытаться выполнить вычитание делителя. Но предварительно необходимо сдвинуть первый результат. Сдвиг должен быть таким, чтобы при последующей операции вычитания был сформирован второй бит частного. В результате сдвига получим.
000001100 Первый результата до сдвига
00001100 Первый результат после сдвига.
Теперь можно выполнить вторую операцию вычитания:
00001100 Сдвинутый первый результат
10100000 Вычитаемое число 1210
10101100 Второй результат
↑
Наличие здесь единицы
означает, что 2-й бит
искомого частного
равен 0 Частное: 10ХХХ
Результат этого вычитания содержит 1 в позиции знака, т.е. получено отрицательное число. Следовательно, делитель не укладывается в соответствующем числе. Поэтому, прежде всего во вторую (по старшинству) позицию поля представления частного следует записать 0. Кроме того, поскольку вычитание не состоялось, необходимо вернуть биты делителя обратно первому результату:
10101100 Второй результат
01100000 Возвращаемое число 1210
00001100 Сдвинутый первый результат (полученный вторично).
Теперь наступает очередь следующего сдвига:
0000100 Сдвинутый первый результат
0001100 Первый результат после второго сдвига
И вновь все готово для попытки уложить делитель в соответствующее число (дважды сдвинутый первый результат). Выполняем третью операцию вычитания:
0001100 Дважды сдвинутый первый результат
1010000 Вычитаемое число 1210
1011100 Третий результат
↑
Наличие здесь единицы
означает, что 3-й бит
искомого частного
равен 0 Частное: 100ХХ
Третий результат – отрицательное число, т.е. подвергнутый двойному сдвигу первый результат оказался меньше делителя, а следовательно, третий бит искомого частного также равен 0. Поэтому число 1210 (делитель) следует вернуть первому результату, сдвинутому дважды:
1011100 Третий результат
0110000 Возвращаемое число 1210
0001100 Дважды сдвинутый первый результат
После исправления допущенной «ошибки» необходимо выполнить очередной сдвиг:
0001100 Дважды сдвинутый первый результат
001100 Первый результат после третьего сдвига
Теперь можно предпринять попытку вычесть делитель из первого результата, подвергнутого троекратному сдвигу:
001100 Первый результат после третьего сдвига
101000 Вычитаемое число 1210
110100 Четвертый результат
↑
Наличие здесь единицы
Означает, что 4-й бит
Частного равен 0 Частное: 1000Х
Поскольку результат этого вычитания есть число отрицательное, бит частного равен 0, и число 1210 необходимо прибавить к четвертому результату:
110100 Четвертый результат
011000 Возвращаемое число 12
001100 Первый результат после третьего сдвига
Выполняем четвертый сдвиг:
001100 Первый результат после третьего сдвига
01100 Первый результат после четвертого сдвига
Опять предпринимается попытка вычитания делителя из последнего результата. Обратите внимание, что на этот раз число 1210 вычитается из числа 1210:
01100 Первый результат после четвертого сдвига
10100 Вычитаемое число 1210
00000 Пятый результат
↑
Наличие здесь 0
Означает, что 5-й
Бит частного равен 1 Частное 10001
На этом выполнение процедуры заканчивается. Таким образом, при делении числа 1100 1100 на число 1100 результат равен 10001.
Рассмотренная процедура двоичного деления несколько сложнее процедуры двоичного умножения. Однако ее нетрудно осуществить на практике, если последовательно выполнять предписываемые операции. Поскольку правила деления четко сформулированы, они могут быть реализованы в микропроцессоре. Следует, однако, удостовериться, что эти правила справедливы для всех возможных ситуаций.
Рассмотрим еще один пример, чтобы быть уверенным в правильности понимания описанной выше процедуры. Требуется разделить число 35 на число 5. Процедура так называемого длинного деления двоичных эквивалентов этих чисел имеет следующий вид:
100011 101
000 0111
1000
101
00111
101
0101
101
000
Представим делитель в дополнительном коде:
0101 Число 510
1010 Обратный код числа
0001 Единица, добавляемая к обратному коду
1101 Дополнительный код числа
Теперь опишем процедуру деления методом вычитания и сдвига влево:
Двоичная арифметика Бит частного Наименование операндов
0100011 Делимое 3510
1011000 Дополнительный код числа 510
1111011 0 Первый результат
1111011 Первый результат
0101000 Возвращаемое число 510
0100011 Делимое
100011 Делимое после первого сдвига
101100 Дополнительный код числа 510
001111 Второй результат
00111 Второй результат после сдвига
на 1 позицию
10110 Дополнительный код числа 510
00101 1 Третий результат
0101 Третий результат после сдвига
на 1 позицию
1011 Дополнительный код числа 510
0000 1 Четвертый результат
Если процедуру деления продолжить и далее, то все последующие биты частного окажутся равными 0. Обычно известно число ожидаемых битов частного и местоположение двоичной точки. Например, при делении 16-битового делимого на 8-битовый делитель частное состоит из 8 бит. Когда известно положение двоичной точки делимого и делителя, то автоматически определяется положение двоичной точки частного.
Задания для самопроверки:
1. К повторению каких перечисленных здесь операций сводится деление: а) сложения; б) вычитания, в) умножения или г) всех указанных операций?
2. Объясните, почему для выполнения деления требуется более сложный набор правил, чем в случае умножения?
3. Используя описанную выше процедуру двоичного деления путем вычитания и сдвига, выполните деление следующих положительных чисел: а)11110/101, б)10101/111, в) 101000/100, г)1001/11, д)1100011/1001, е) 10000100/1100.
Проверьте полученные результаты, используя процедуры двоичного и десятичного длинного деления.
Вопрос 9
Дата добавления: 2018-04-15; просмотров: 1264; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!