мое назначение - написать компилятор, который скомпилирует небольшой язык программирования на поддельный язык ассемблера (ячейки регистров и ячеек имеют неопределенную длину).Алгоритм быстрого умножения в сборке
Что я должен сделать, это преобразование такой инструкции:
a = b * c
к набору INC, З, ADD Инструкции (где я это указатель на память, есть только один регистр доступен), который будет выполнить умножение. Проблема заключается в том, что алгоритм должен выполнять свою работу в O (log n) времени.
Может кто-нибудь объяснить шаг за шагом алгоритм решения этой проблемы? Мой друг упомянул алгоритм Бута-Максорли, но я его почти не понимаю.
РЕДАКТИРОВАТЬ: Поддельные инструкции по сборке включают в себя: чтение, запись, НАГРУЗКА я, МАГАЗИНА я, ADD I, SUB я, ШР я, СХЛ я, INC, СБРОС, ПРЫГНУТЬ к, JZERO к, Джодд к (перехода к к если регистр нечетный)
Возможно, что-то вроде if (или в форме asm) или только эти три команды? Являются ли числа в двоичном 2-дополнении, или только положительным, или ...? – deviantfan
Старые «расширенные алгоритмы умножения» предназначены для аппаратной реализации, включая Booth (используют пробеги одинаковых бит) и McSorley (вариант radix-4). Посмотрите на стандартный бинарный алгоритм, спросите своего друга, к чему она стремилась, укажите управление потоком и/или условную арифметику вашей сборки _fake_, дайте миру понять, насколько ваши попытки заставили вас. (Я ожидаю, что 'undefined length' испортит дополнение двух.) – greybeard
Что представляет' n' в 'O (log n)'? Величина 'a',' b' или 'c'? Или длина бит регистра? Число бит «1» в двоичном представлении одного из чисел? Что-то еще? Я думаю, что то, о чем вы просите, может быть сделано в 'O (n)' на длину бит регистра или 'O (log n)' от величины одного из чисел, которые вы пытаетесь размножить ... – twalberg