ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 24.12.2021
Просмотров: 6848
Скачиваний: 22
212
для отримання останнього розряду суми перенос повинен бути сформованим всіма операторами однорозрядного двійкового додавання. Для зменшення кількості операцій, які знаходяться на критичному шляху, створено ряд алгоритмів додавання, в яких скорочено кількість послідовних операцій при формуванні переносу. Це здійснюється шляхом паралельного формування переносів для всіх розрядів (так званий прискорений перенос), або паралельного формування переносів для груп розрядів (так званий частково-прискорений перенос), або використання алгоритму за методом вибору переносу.
6.4.2. Додавання двійкових чисел із знаками
Як ми вже бачили в попередньому розділі, існує чотири методи представлення п-роз-рядних чисел із знаками: в прямому, оберненому та доповняльному кодах, а також із зміщенням. В прямому коді старший розряд представляє знак числа, а наступні n-1 розряди представляють модуль числа. В оберненому та доповняльному кодах додатні числа мають те ж саме представлення, що і в прямому. Представлення ж від'ємних чисел тут є іншим. В оберненому коді від'ємні числа представляються шляхом інверсії їх розрядів, а в доповняльному коді крім того до молодшого розряду оберненого коду додається одиниця. В представленні із зміщенням всі числа, як додатні так і від'ємні, додаються до зміщення і отримані суми представляються як звичайні числа без знаків. Так від'ємне число k буде представлене як k + b > = 0, де b - зміщення. Типовим значенням зміщення вибирається число 2n- 1.
Приклад: використовуючії чотирирозрядну сітку (n = 4), представимо в описаних вище кодах число k = - 3 (або в двійковій системі k = - 0112). В прямому коді k = 10112, причому старший розряд є знаковий. В оберненому коді k =11002 , а в доповняльному коді k = 11012. Для системи із зміщенням, коли зміщення Ь=2n - 1=8, маємо k = 01012.
Додавання чисел, представлених в прямому коді, вимагає проведення початкового аналізу знаків чисел. Якщо знаки однакові, то модулі чисел додаються, а результату присвоюється їх знак до проведення додавання. Якщо ж їх знаки різні, то модулі чисел віднімаються, а результату присвоюється знак більшого за модулем числа, або знак "+", якщо модулі чисел є рівними.
Додавання чисел, представлених в оберненому та прямому кодах, не залежить від 'їх знаків і проводиться так само як додавання додатних чисел в прямому коді з тією різницею, що при додаванні чисел, представлених в оберненому коді, необхідно перенос з старшого розряду подавати на вхід переносу молодшого розряду. Представлення в доповняльному коді використовується значно ширше, ніж в оберненому, оскільки при додаванні чисел тут перенос із старшого розряду просто ігнорується. Наприклад, додавши 5+(-2) в доповняльному коді маємо 01012 + 11102 = 00112. Тобто отриманий правильний результат 3 при ігноруванні переносом із старшого розряду. Якщо ж додати ті ж самі числа в оберненому коді отримаємо 01012 + 11012 + 1 = 00112. Тобто також отриманий правильний результат 3 при врахуванні переносу із старшого розряду. Цей перенос називається циклічним. Додавання до отриманої суми одиниці циклічного переносу не викликає повторного циклічного переносу Наведений приклад наглядно ілюструє рис. 6.10.
213
Крім того, потрібно зауважити, що в доповняльному коді для представлення нуля існує лише один код - всі нулі, тоді як в оберненому коді два - всі нулі та всі одиниці, що призводить до неоднозначностей.
При виконанні додавання двійкових чисел можливе переповнення, коли отримана сума перевищує діапазон представлення чисел, тобто коли вона виходить за межі розрядної сітки. Для інформування програміста про отримання неправильного результату переповнення повинно бути зафіксованим. Для фіксації переповнення аналізуються знакові розряди чисел. Переповнення виникає тільки при додаванні чисел з однаковими знаками і виявити його можна порівнюючи знаки суми і доданків. При переповненні знак суми S не дорівнює знакам доданків х та у, тобто Signx = Signy =/ SignS.
Для спрощення фіксування наявності переповнення використовуються так звані модифіковані коди з двома знаковими розрядами (тобто 0 представляється як 00, а 1 представляється як 11). Неоднаковість цих розрядів після виконання операції означає наявність переповнення, як це показано на прикладах на рис. 6.11.
В першому прикладі відбулося переповнення, оскільки два перші розряди, які представляють знак, не є однаковими.
6.4.3. Віднімання двійкових чисел
Віднімання можна проводити двома способами: проведенням безпосередньо віднімання розрядів чисел або додаванням двійкового коду від'ємника з протилежним знаком. Перший спосіб, як правило, використовується тоді, коли числа представлені в прямому коді. Віднімання проводиться подібно до віднімання в десятковій системі: віднімаються відповідні розряди, а при виникненні одиниці запозичення вона вираховується з старшого розряду. Віднімання можна описати такими формулами:
Si= хi XOR уi XOR bi
bi+1=(xi AND уi) OR (xi-AND bi) OR (уi AND bi)
b0=0
Ці формули отримані з наступної таблиці істинності (табл. 6.6).
214
Таблиця 6.6
bi |
Xi |
уi |
Si |
сі+1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
Де: Si. - і-й розряд різниці, хi, уi - і-ті розряди зменшуваного та від'ємника відповідно, bi. - розряд запозичення.
Приклади виконання операції віднімання двійкових чисел без знаків приведено на рис. 6.12.
Коли числа представлені в оберненому або доповняльному кодах, то можна використати інший метод: потрібно змінити знак від'ємника, всі його розряди потрібно інвертувати, а для доповняльного коду, крім того, збільшити від'ємник на одиницю молодшого розряду, і тоді просто додати до зменшуваного отримане число S = х + (NOT(y) + 1 м.р.).
6,4.4. Множення двійкових чисел
Множення може проводитись в прямому, оберненому та доповняльному кодах. Знак результату операції множення можна визначати окремо. Для цього використовується операція XOR над знаковими розрядами співмножників відповідно до табл. 6.7.
Таблиця 6.7
■ знак Х |
знак Y |
Знак результату |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
_ 1 |
1 |
0 |
При виконанні множення двох операндів однакової розрядності розрядність результату збільшується вдвічі, порівняно з розрядністю множників.
При виконанні множення операндів, представлених в прямому коді, їх модулі множаться як цілі двійкові числа без знаків, або як дробові числа без знаків, оскільки про-
215
цедура множення в обох випадках та ж сама. При виконанні множення операндів, представлених в оберненому коді, всі розряди від'ємних чисел потрібно інвертувати, а далі проводити множення так само, як над даними, представленими в прямому коді. Разом з тим, потрібно зауважити, що існують методи прямого множення операндів, представлених в обернених кодах.
6.4.4.7. Множення цілих двійкових чисел без знаків
Якщо позначити множене буквою X, а множник буквою Y, причому представити Y у вигляді суми його двійкових розрядів
то результат Z множення двох цілих двійкових чисел без знаків визначається з виразу:
З наведеного виразу видно, що операція множення двійкових чисел зводиться до операції логічного множення множеного (множене - перший множник) на розряди множника та підсумовування отриманих результатів з їх зсувом на кількість розрядів, рівну відповідному показнику ступеня у виразі. Граф алгоритму множення має вигляд, показаний на рис. 6.13.
Лінійка операторів AND формує п n-розрядних результатів логічного множення множеного на розряди множника, які зсуваються праворуч на R. (і = 1, 2, ..., п-1) розрядів. Ці результати називаються частковими добутками. Оператор із знаком додавання тут означає багатомісну операцію додавання часткових добутків.
216
6.4.4.2. Багатомісна операція додавання часткових добутків
Алгоритм виконання багатомісної операції додавання часткових добутків залежить від типу використовуваних операторів додавання. Це можуть бути зокрема оператори попарного n-розрядного додавання двох чисел, оператори попарного однорозрядного додавання двох чисел, оператори багатомісного паралельного додавання чисел і т. д. Якщо використовувати оператори попарного n-розрядного додавання двох чисел, тобто двох часткових добутків, то можуть бути запропоновані наступні алгоритми:
" алгоритм послідовного попарного додавання часткових добутків, отриманих починаючи з аналізу молодших розрядів множника;
-
алгоритм послідовного попарного додавання часткових добутків, отриманих починаючи з аналізу старших розрядів множника;
-
алгоритм паралельного попарного додавання часткових добутків з використанням структури бінарного дерева.
Граф алгоритму послідовного попарного додавання часткових добутків, отриманих починаючи з аналізу молодших розрядів множника, показаний на рис. 6.14.
Тут послідовно з'єднані оператори двомісного (попарного) додавання (ОДД), причому часткові добутки подаються для додавання із зміщенням на і (L1,L2, ..,Li, Ln-1) розрядів ліворуч. Молодший розряд результату кожного і-го ОДД (ОДД,, ОДД2,..., ОДДn-1) є відповідним розрядом добутку Zi, а нульовий розряд добутку є рівним молодшому розряду першого часткового добутку. Розряди добутку від Z2n-1-го до Zn-1-го отримуються з виходів (nІ)-го оператора ОДД, починаючи з другого виходу.
Подібним до розглянутого є алгоритм послідовного попарного додавання часткових добутків, отриманих починаючи з аналізу старших розрядів множника, граф якого показано на ис. 6.15.