2016-05-04 7 views
-2

У меня есть следующий набор команд для простого компьютераКак я могу проверить, делится ли число n на 10?

Instruction set

Там нет никакого остатка или модуль команды в указанном выше наборе команд. Таким образом, последняя часть моего проекта - проверить, является ли число n, полученное мной из предыдущих вычислений, которое составляет максимум 16 бит, делится на 10. Если это тогда, я должен сохранить заданный номер n в памяти данных, если он не является 't тогда число недействительно, я должен использовать инструкции в приведенном выше списке.

Я не могу получить логику, чтобы проверить, делится ли n на 10 или нет. Я уже знаю, как проверить, является ли n четным или нечетным, но это не решает проблему делимости.

+1

Gasp ... Вы могли бы на самом деле нужно * реализовать * Ваше собственная функция деления с основными доступными кодами операций. –

+1

[Внесите оператор разделения самостоятельно] (http://stackoverflow.com/q/5284898/995714) или проверьте, делится ли число на 2 ** и ** [на 5] (http://stackoverflow.com/ д/17113660/995714). [Разделить на 10 с использованием сдвигов бит] (http://stackoverflow.com/q/5558492/995714), [делить на 10 в ARM] (http://stackoverflow.com/q/16218228/995714), [C++ fast деление/мода на 10^x] (http://stackoverflow.com/q//995714) –

ответ

0

самый простой способ разделить на 10, чтобы повторно вычесть 10, «до остатка составляет менее 10

result = 0 
remains = divident 
while (remains >= divisor) 
    result++ 
    remains -= divisor 

более умный способ заключается в использовании сдвиг, в котором повторно (ширина регистра определяет, как часто вы должны сдвигать) результат сдвига и divident слева, перемещая перенос во второй регистр. Всякий раз, когда этот 2-й регистр заполняется или равен делителю, вычитайте его из второго и увеличивайте результат на единицу.
(это аналогично тому, как десятичные разделены в школе, если помните)

что-то вроде этого (предполагая, что 32 разрядные регистры)

result=0 
temp=0 
loop 32 times 
    shift left result 
    shift left divident 
    shift left with carry temp 
    if (temp > divisor) 
     result ++ 
     temp -= divisor 
Смежные вопросы