2013-12-21 5 views
0

Carry save aithmetic использует в два раза больше бит, одно слово для хранения «виртуальной суммы», одно для удерживания «виртуального переноса», чтобы избежать распространения переноса, который является лимитирующим фактором в аппаратной скорости ,Правое смещение номера сохранения переноса

У меня есть система, которая требует деления этих чисел на две степени, но просто смещение вправо обоих чисел не работает во всех случаях, например. два 16-битных переносных номера сохранения, которые вы добавляете для создания 4000, C001 - это виртуальная сумма, 7FFF - виртуальный перенос.

C001 + 7FFF = 4000 (discard overflow bits) 
but after right shift 
6000 + 3FFF = 9FFF (when it should be 2000) 

Вкратце: Как вы разделите номер сбережения на две силы? (Сохраняя при этом номер сохранения переноса)

+0

Не могли бы вы объяснить смысл ваших строк? Что означает c001 7fff = 4000? –

+0

Добавлено немного больше. После всех операций вы добавляете виртуальный перенос и виртуальное сохранение, чтобы вернуть обычный двоичный номер – StanOverflow

ответ

1

Во-первых, сдвиг вправо на 1 эффективно удаляет на 2, забыв о остатке. Но остаток может потребоваться для получения точного результата. Например, измените свой первоначальный пример с добавлением C000 до 8000 или C002 в 7FFE. Оба дают ту же сумму, но сумма сдвинутых значений составляет A000 вместо 9FFF, и это определенно более правильно. Таким образом, вы можете сделать такое смещение, только если сумма LSB может быть потеряна. В вашем случае с 2 слагаемыми и 1 битным сдвигом это означает, что не более 1 слагаемого может иметь 1 в своем LSB.

Во-вторых, подумайте, что это исправлено, и у вас есть A000. В простой идеальной математике говорится (a + b)/2 == a/2 + b/2. Для вашего случая, бит переноса, который вы первоначально проигнорировали, взвешивал 0x10000, но после смещения на 1 он весит 0x8000. Именно так A000 отличается от ожидаемого 2000. Таким образом, если вы уверены в других аспектах своего метода, закончите его с логическим И с ~ 0x8000 == 0x7FFF.

+0

. Я вижу, мне нужно проверить, что я не теряю перенос с правой стороны и не добавляю число, которое было бы отброшено слева. – StanOverflow

+0

Спасибо, высоко оценили – StanOverflow

0

Существует методика коррекции представления, такая, что она может меняться. Это происходит от бумаги «Carry-save архитектуры для высокоскоростной цифровой обработки сигналов» Тобиаса Нолла. Вы можете вычислить новые знаковые биты перенесенных и сумму векторов, как

с»= c_out

S'= s исключающего с исключающим c_out

где s и с являются оригинальными знаковыми-биты и c_out это отброшенный бит переноса из сложения переноса.