Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Поразрядные операции и сложение/вычитание
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
Peshii Vsadnik
Простой вопрос, но совсем отупел, а ответа не нашел. Предположим, имеется два регистра A и B, и нужно уметь их сложить или вычесть, однако доступны только поразрядные операции AND, OR, XOR, NOT (в ALU). Какие последовательности поразрядных операций приводят к сложению A и B и к их вычитанию? Имеется ввиду нечто похожее на ADD и SUB.
arttab
Если я Вас правильно понял, то Вым нужен оператор If, else. Т.е. "считать в ручную" с проверкой пар битов и учет переноса.
Peshii Vsadnik
это, видимо, самый долгий способ, фактически представляющий работу полного сумматора, только в программном эквиваленте. А вот есть ли способ написать нечто вроде ~(A)&(B^A)|B.... ну и так далее, чтобы в результате получить A+B и A-B? вот в чем вопрос... Для вычитания можно B перевести в дополнительный код и использовать суммирование, но как реализовать суммирование?
Да, не используя сдвига! Со сдвигом просто - сдвинули B так, чтобы биты не перекрывались, и взяли A|B
alex1464
Еслия не ошибаюсь, то одноразрадный сумматор описывается так
sim =(a1 xor a2 xor )carry_in
carry_out= (a1 and a2) or (carry_in and (a1 or a2))
Из таких одноразрадных сумматорв можно сдалать сумматор с последовательным переносом.
AndreyNP
Есть еще вариант реализации - табличный
Применяется когда нужна максимальная скорость вычисления и достаточно памяти
Так можно реализовать любые функции и никаких логических операций smile.gif
Возможно также комбинировать табличный способ с прямым вычислением
michael34
Попробуй по очереди заменять нулями все биты, кроме одного. по-моему раньше у меня этот метод прокатывал, хотя точно не помню. А тетрадки с практических занятий все растерял...
Shamil
Цитата(Peshii Vsadnik @ Dec 26 2005, 15:21) *
А вот есть ли способ написать нечто вроде ~(A)&(B^A)|B.... ну и так далее, чтобы в результате получить A+B и A-B? вот в чем вопрос...
Да, не используя сдвига!


Одной формулой не получиться, и без сдвига не обойтись,
если только не делать поразрядного вычисления (которое
само по себе требует сдвига).

Тут нужно сделать N итераций (где N – количество
разрядов операндов, в худшем случае) следующего вида:
1. Вычислить сумму A и B без учета переносов – Sab = A xor B
2. Вычислить слово переносов для этих операндов – Cab = A & B
3. Сдвинуть слово переносов влево на один разряд
4. Вычислить арифметическую сумму Sab и сдвинутого слова переносов Cab

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

Цитата(Peshii Vsadnik @ Dec 26 2005, 15:21) *
Со сдвигом просто - сдвинули B так, чтобы биты не перекрывались, и взяли A|B

Это как это ? Откуда возьмется сумма ?


P.S. А где ты откопал такое странное ALU ?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.