2016-05-04 29 views
-2

Ich habe folgende Anweisung für einen einfachen Computer eingestelltWie kann ich überprüfen, ob eine Zahl n durch 10 teilbar ist?

Instruction set

Es gibt keinen Rest oder Modulus Befehl in dem obigen Befehlssatz. Der letzte Teil meines Projekts ist also zu überprüfen, ob die Zahl n, die ich aus früheren Berechnungen erhalten habe, die maximal 16 Bits beträgt, durch 10 teilbar ist. Wenn es dann ist, muss ich die angegebene Zahl n im Datenspeicher speichern, wenn es nicht ist Wenn die Nummer ungültig ist, muss ich die Anweisungen in der obigen Liste verwenden.

Ich kann nicht die Logik zu gehen bei der Überprüfung, ob n ist durch 10 teilbar oder nicht. Ich weiß bereits, wie man überprüft, ob n gerade oder ungerade ist, aber das löst das Teilbarkeitsproblem nicht.

+1

Gasp ... Sie könnten tatsächlich * implementieren * Ihre eigene Divisionsfunktion mit den verfügbaren Basisopcodes. –

+1

[Implementieren Sie den Divisionsbetreiber selbst] (http://stackoverflow.com/q/5284898/995714), oder prüfen Sie, ob die Nummer durch 2 teilbar ist ** und ** [um 5] (http://stackoverflow.com/ q/17113660/995714). [Durch Bit-Shifts um 10 dividieren] (http://stackoverflow.com/q/5558492/995714), [dividiere durch 10 in ARM] (http://stackoverflow.com/q/16218228/995714), [C++ schnell Division/Mod von 10^x] (http://stackoverflow.com/q//995714) –

Antwort

0

der einfachste Weg, um 10 zu teilen ist immer wieder 10 zu subtrahieren, ‚til den Rest weniger als 10

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

eine clevere Art und Weise Schicht verwenden wird, in dem Sie wiederholt (die Registerbreite bestimmt, wie oft muss man shiften) shift result und divident left, verschiebt den carry in ein 2. register. Immer wenn dieses 2. Register größer oder gleich dem Divisor ist, subtrahiere es von der 2. und erhöhe das Ergebnis um eins.
(dies ähnlich, wie Dezimalzahlen in der Schule geteilt werden, wenn Sie sich erinnern)

so etwas wie dieses (unter der Annahme, 32-Bit-Register)

result=0 
temp=0 
loop 32 times 
    shift left result 
    shift left divident 
    shift left with carry temp 
    if (temp > divisor) 
     result ++ 
     temp -= divisor