Які переваги комплекту Two?


11

У деяких пристроях АЦП / ЦАП вони є варіантами для виводу / введення даних у формі доповнення 2.

Які переваги представлення цифрових даних у формі Доповнення двох Якщо ви можете просто мати прямий двійковий код і заощадити час перетворення?


4
Комплімент Двох - це прямий двійковий код ...
Mooing Duck,

"Алгебра працює на машині (Всесвіті), яка є двома доповненнями" - HAKMEM 154 ( inwap.com/pdp10/hbaker/hakmem/hacks.html )
ChrisInEdmonton

2
Що 5 у двох доповненнях? 101. Що таке 5 у прямому двійковому коді? 101. Що становить -5 у двох доповненнях? 1 ... 11111011. Що таке -5 у прямому двійковому коді? Ух ...
користувач253751

Здається, рідкісний особливий випадок, коли АЦП має негативний вихід? Що це навіть означає, що вимірювана напруга нижча від низької опорної напруги? І тільки як би ви побудували таку АЦП? Послідовне наближення з кришками, які мають негативне навантаження ...?
Лундін

Зауважте, що є два різні слова, склад і дотримання . Суб'єкт тут двійки комплемент , навіть якщо ці двійки дуже ввічливі і часто говорять приємні речі про вас.
Піт Бекер

Відповіді:


11

Комплексне представлення двох підписаних цілих чисел легко маніпулювати апаратними засобами. Наприклад, заперечення (тобто x = -x ) можна виконати, просто перевернувши всі біти числа і додавши один. Виконання тієї ж операції в сирому двійковому (наприклад, з бітовим знаком), як правило, передбачає набагато більше роботи, тому що ви повинні ставитися до певних бітів у потоці як до спеціальних. Те ж саме стосується і додавання - операція додавання для від'ємних чисел ідентична операції додавання для додатних чисел, тому для обробки негативного випадку не потрібна додаткова логіка (не призначена каламбур).

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


1
Перегортаючи біти, потім додаючи 1 до відміни, немає ??
Скотт Сейдман

2
@ScottSeidman Так, вибачте, я трохи забув. Відредаговано для виправлення :)
Поліном

1
Насправді, для максимальної вибору, залежно від процесора, може бути за один цикл прийняти x = x * -1, або x = 0 - x , проти принаймні двох циклів для x = ~ x + 1
markt

@markt Так, але якщо ви впроваджуєте лише мінімальний пристрій (тобто не повний процесор), то є сенс скоротити складність кремнію до мінімуму.
Поліном

5
+1 Крім того , додаток двійок має тільки одне значення для 0. Інші (наприклад, свого доповнення або знаковий біт) в кінцевому підсумку, два
sbell

5

АЦП може конвертувати дані (скажімо, вхідні напруги між 0 і 5 В), і вам або потрібно, щоб дані не були підписані (0V = 0, 5V = максимальний код) або підписувалися (2.5V = 0, 0V = max-ve, 5V = max + ве).

Окрім того, що додаток 2 є найпоширенішим комп’ютерним представленням підписаних даних, перетворення між двома описаними вище форматами є абсолютно тривіальним: просто інвертуйте MSB!

Це неймовірно дешево додати до внутрішньої логіки АЦП і надає АЦП ще одну точку продажу на аркуші даних ...


Щойно додав перемикач MSB між двома доповненнями та зсувом у двійковій формі як коментар нижче
Скотт Сейдман,

3

Якщо вам потрібно виконати математику на поданні від'ємних чисел, доповнення двійок робить це простіше, ніж зміщення двійкових, яке буде відповідати типу даних "підписаний int". Ваш компілятор буде просто знати, як з цим боротися. В іншому випадку ви витрачаєте кліщі годинника, перетворюючи назад і назад.


1

З цього питання, мабуть, мається на увазі, що АЦП потребує більше часу, щоб повернути значення у формі доповнення 2, ніж у прямій двійковій формі. Хоча це може бути і в якійсь конкретній реалізації АЦП, це взагалі не відповідає дійсності (наприклад, мікроконтролери серії MSP430 мають периферійну мережу АЦП, яка повідомляє про значення у прямому бінарному чи 2-му доповненні, але це займає однакову кількість циклів в обох випадках).

Якщо це не виходить, вибір між доповненням 2 та прямим бінарним файлом зводиться здебільшого до того, як працюють перетворювачі та як ви хочете обробляти свої дані.

У прямому бінарному режимі АЦП дає вам число, яке представляє співвідношення між величиною вимірюваної аналогової величини (практично завжди напруга) та повномасштабною контрольною величиною. Наприклад, 10-бітний АЦП може повертати значення від 0 до 1023 (включно). Якщо ви вимірюєте напругу (скажімо, 1,25 Вольт), що становить половину від опорної напруги АЦП (скажімо, 2,50 Вольт), то бінарний код, який ви читаєте, буде половиною від максимального значення, яке ви могли прочитати - значить, 512 або після цього, за умови округлення та нелінійності в АЦП.

Наприклад, скажімо, у вас є перетворювач, який повідомляє про кількість ракетного палива в баку. 0В означає, що резервуар порожній, а 2,5 В - означає, що він сповнений. Таким чином, ви просто підключите перетворювач до свого АЦП, і ви їдете далеко!

Але зауважте, що у наведеному вище пункті немає способу вимірювати негативні напруги. Що робити, якщо ми хотіли виміряти витрату ракетного палива в танк з танка (і у нас був перетворювач для цього)? АЦП не може виміряти від’ємні числа, тому у нас є проблема. Однак існує простий спосіб підробити це за допомогою режиму доповнення 2: У цьому випадку вихід перетворювача повторно зміщується так, що нульова точка знаходиться на півдорозі між двома опорними напругами АЦП. Іншими словами, позитивні потоки представлені напругами між 1,25 В і 2,50 В, а негативні потоки представлені від 1,25 В до 0 В - так потоки в бак дадуть коди АЦП від 512 до 1023, а потоки з подяки дадуть коди від 511 до 0 (у прямому бінарному форматі).

Зараз це жахливо незручно. Ми повинні відняти 512 від кожного вимірювання, перш ніж робити що-небудь з ним, що дає числа в діапазоні від -512 до +511. Сенс режиму доповнення 2 полягає в тому, що він робить це для вас!

Однак ви все ще можете використовувати прямий бінарний з перетворювачем, який видає підписані результати. Наприклад, ваш перетворювач може мати диференційовані виходи. У цьому випадку ви хочете все одно відняти інвертований вихід з неінвертованого виходу, тому використовувати перевагу 2 не має переваги.


1

Система комплектування обох використовується, оскільки вона випливає з того, як звичайно функціонує апаратне забезпечення. Подумайте, наприклад, одометр автомобіля, який ви скинули на нуль. Потім надіньте передачу на зворотному ходу і рухайтесь назад на відстані 1 миля (будь ласка, не робіть цього в реальності). Ваш одометр (якщо він буде механічним) перекинеться з 0000 до 9999. Система комплектування обох поводиться аналогічно.

введіть тут опис зображення


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

І так, одометр мого Nissan працює так.


Ваша відповідь стосується переповнення (і підтоку), але оскільки одометр не відображає негативних чисел, він не стосується нічого, що стосується доповнення двох ...
marcelm

@marcelm, На насправді, приклад одометра робить пояснити двійки доповнення. Просто PkP не пішов досить далеко з поясненням. Якщо шестизначний одометр зчитує нуль, а ви їдете назад за одну милю, тоді ви очікуєте, що він прочитає -1. Натомість він читає 999999. Це тому, що 999999 - це шестизначне, десятки доповнюють подання -1.
Соломон повільно

@jameslarge Ні, це все ще ні. У відповіді немає нічого, що насправді стосується доповнення двох. Або доповнення, або знамення, або будь-яке підписане число.
marcelm

@marcelm Так, є: сама основна ідея системи доповнення обох: що нуль мінус один дорівнює максимальному представленому непідписаному цілому числу. Така ідея системи доповнення двох. Жодне інше представлення підписаних номерів не пропонує цього (наскільки мені відомо). І приклад одометра показує, наскільки природно ця поведінкова властивість походить від простоти техніки; у випадку одометра: з машинобудування. І в механічному, і в електронному світі це (система доповнення обох) є найпростішим способом змусити її працювати.
PkP

0

Інші вже відповіли, чому двійкові компліменти для двійників зручні для комп'ютерного обладнання. Однак, ви, здається, запитуєте, чому A / D видасть комплімент двом замість "прямого бінарного" (що б ви думали, що це насправді означає).

Більшість A / D виводять просте непідписане бінарне значення, що становить від 0 до 2 N -1, де N - кількість біт, до яких перетворюється A / D. Зауважте, що це також можна вважати компліментним позначенням двох, лише те, що значення ніколи не бувають негативними. Якщо ви маєте справу лише з додатними числами, то більшість двійкових уявлень однакові. Сюди входить подвійний комплімент та знамення.

Деякі А / Д, особливо вбудовані в мікроконтролери, мають можливість створювати негативні значення для нижньої половини їх діапазону. Це може бути сприйнятою перевагою при вимірюванні біполярного сигналу.

Принаймні, в мікроконтролері це взагалі нерозумно. У деяких випадках ви можете використовувати значення А / Д безпосередньо без перетворення. У цьому випадку всі інші значення ви вже перетворили на діапазон A / D. Обмеження того, що всі негативні числа насправді спрощує речі.

В іншому випадку ви все одно застосуєте масштабування та зсув до показань A / D, щоб перенести їх у будь-які одиниці, які ви використовуєте для значень всередині. Тут знову немає недоліків неподписаних значень, що виходять безпосередньо з A / D. Насправді я зазвичай застосовую деяку фільтрацію низьких частот на вихідні значення перед будь-яким масштабуванням та зміщенням. Знання цих значень ніколи не буде негативним, трохи спрощує обчислення. Здійснення масштабування непідписаних значень також іноді робить дещо простішими.

Я не можу згадати жодного випадку в більш ніж 100 проектах мікроконтролерів, де я використовував A / D у будь-якому, крім непідписаному форматі виводу.

Отже, щоб відповісти на питання, які переваги мають A / D-вихід "комплімент подвійним", є дві відповіді:

  1. Усі вони так чи інакше, лише те, що в більшості випадків ці значення не є негативними, тому ви не можете визначити різницю між компліментами двійки та іншими позначеннями, наприклад, величиною знаку.

  2. Переваги дуже незначні. Усередині мікроконтролера їх по суті немає.

    У спеціалізованому обладнанні може бути певна перевага мати негативні значення, що вказують на негативну вхідну напругу, і в цьому випадку комплімент двом - це найпростіший спосіб розібратися з діапазоном значень. Зауважте, що якщо діапазон вхідної напруги не симетричний приблизно 0, то ця перевага знижується.


-1

Що це за «прямий двійковий код», про який ви говорите? Я припускаю, що ви маєте на увазі наявність знака біт, який є "1" для негативного і "0" для позитивного (або навпаки ). У цього є ще два недоліки щодо доповнення двійок, про які ще не було сказано: один в основному не має значення в наші дні і один важливий.

В основному нерелевантним є те, що ви можете представляти одне менше число - тобто 255 чисел у 8 бітах. Це дуже неважливо, якщо у вас є 32 або 64 біти, але має значення, коли у вас було менше 4 або 6 біт для роботи.

Більш важливим є те, що зараз існує два способи представити одне і те ж число - конкретно, 0 - +0 і -0, але +0 і -0 - це одне і те ж число, тому ваша реалізація повинна переконатися, що ви не порівнюєте їх цифри щоразу, коли ви робите перевірку рівності.


Я думаю, що ти тут позаду. Ви говорите про представлення величини знаків, коли ОП досить чітко говорило про непідписане бінарне подання.
Джо Хасс

1
Якщо ви говорите про непідписане представлення, тоді немає переваги додатку Двох. Це просто трохи витрачається.
Джек Едлі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.