Операции над двоичными числами.



При сложении двух единиц происходит перенос из данного разряда в следующий, более старший разряд, а при вычитании в двоичном разряде единицы из нуля происходит заем в данным разряд из более старшего разряда, в результате в данном разряде устанавливается единица.

Рассмотрим сложение двоичных эквивалентов десятичных чисел 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

      +                                                                _

           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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!