реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Поразрядные операции и сложение/вычитание, как проще реализовать?
Peshii Vsadnik
сообщение Dec 23 2005, 13:26
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 20
Регистрация: 28-12-04
Пользователь №: 1 717



Простой вопрос, но совсем отупел, а ответа не нашел. Предположим, имеется два регистра A и B, и нужно уметь их сложить или вычесть, однако доступны только поразрядные операции AND, OR, XOR, NOT (в ALU). Какие последовательности поразрядных операций приводят к сложению A и B и к их вычитанию? Имеется ввиду нечто похожее на ADD и SUB.
Go to the top of the page
 
+Quote Post
arttab
сообщение Dec 26 2005, 03:26
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



Если я Вас правильно понял, то Вым нужен оператор If, else. Т.е. "считать в ручную" с проверкой пар битов и учет переноса.


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
Peshii Vsadnik
сообщение Dec 26 2005, 10:21
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 20
Регистрация: 28-12-04
Пользователь №: 1 717



это, видимо, самый долгий способ, фактически представляющий работу полного сумматора, только в программном эквиваленте. А вот есть ли способ написать нечто вроде ~(A)&(B^A)|B.... ну и так далее, чтобы в результате получить A+B и A-B? вот в чем вопрос... Для вычитания можно B перевести в дополнительный код и использовать суммирование, но как реализовать суммирование?
Да, не используя сдвига! Со сдвигом просто - сдвинули B так, чтобы биты не перекрывались, и взяли A|B

Сообщение отредактировал Peshii Vsadnik - Dec 26 2005, 10:28
Go to the top of the page
 
+Quote Post
alex1464
сообщение Dec 26 2005, 10:35
Сообщение #4


Участник
*

Группа: Свой
Сообщений: 63
Регистрация: 7-12-05
Пользователь №: 11 940



Еслия не ошибаюсь, то одноразрадный сумматор описывается так
sim =(a1 xor a2 xor )carry_in
carry_out= (a1 and a2) or (carry_in and (a1 or a2))
Из таких одноразрадных сумматорв можно сдалать сумматор с последовательным переносом.

Сообщение отредактировал alex1464 - Dec 26 2005, 10:37
Go to the top of the page
 
+Quote Post
AndreyNP
сообщение Dec 28 2005, 15:09
Сообщение #5





Группа: Новичок
Сообщений: 3
Регистрация: 17-11-05
Пользователь №: 10 991



Есть еще вариант реализации - табличный
Применяется когда нужна максимальная скорость вычисления и достаточно памяти
Так можно реализовать любые функции и никаких логических операций smile.gif
Возможно также комбинировать табличный способ с прямым вычислением
Go to the top of the page
 
+Quote Post
michael34
сообщение Jan 25 2006, 11:20
Сообщение #6


Участник
*

Группа: Свой
Сообщений: 61
Регистрация: 24-01-06
Пользователь №: 13 541



Попробуй по очереди заменять нулями все биты, кроме одного. по-моему раньше у меня этот метод прокатывал, хотя точно не помню. А тетрадки с практических занятий все растерял...
Go to the top of the page
 
+Quote Post
Shamil
сообщение Jan 25 2006, 16:22
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 160
Регистрация: 23-12-04
Из: Уфа
Пользователь №: 1 631



Цитата(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 ?
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 9th July 2025 - 00:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.01402 секунд с 7
ELECTRONIX ©2004-2016