2012-04-11 6 views
4

Ich betrachte die specification für die DCPU-16 und ich habe Probleme beim Verständnis des Zwecks des Überlaufwertes mit dem Befehl DIV:DCPU-16 DIV-Anweisung

DIV a, b - Sätze a zu a/b, setzt O auf ((< < 16)/b) & 0xffff.

Kann jemand die semantische Bedeutung von O hier erklären, wozu es nützlich wäre?

+0

Ich würde argumentieren, es ist schlimmer als nutzlos, mit 'O' erfordert eine 32/16-Bit-Division! Das Setzen von 'O' auf den Rest wäre nützlicher gewesen und hätte die Arithmetik mit mehreren Genauigkeiten vereinfacht. –

Antwort

6

Es sieht aus wie O gibt den Bruchteil des Ergebnisses (als Festkommazahl). Betrachten wir zum Beispiel 5/2:

a = 5/2 = 2 (integer part) 
O = ((5 << 16)/2) & 0xffff = (327680/2) & 0xffff = 32768 

Wenn Sie O als die 16 binären Nachkommastellen betrachten, dann stellt dies die 0,5 Bruchteil des Ergebnisses.

Ein anderer Weg, es zu betrachten das binäre Ergebnis in Bits ist:

aaaaaaaaaaaaaaaa.OOOOOOOOOOOOOOOO 

5/2

0000000000000010.1000000000000000 

ist, wie Sie durch Inspektion sagen kann, dass Ergebnis ist 5 (101 binär) um ein Bit nach rechts in die Bruchbits verschoben.

2

((a<<16)/b) gibt Ihnen den 16-Bit-Bruchteil der Division.

Es ist einfacher zu sehen in base-10: Wenn wir die ersten drei Nachkommastellen von sagen wir 5/3 finden möchten, können wir 5 drei Stellen über (5000) verschieben, durch 3 dividieren und dann nehmen die letzten drei ganzen Ziffern. 5000/3 ist 1666, also die ersten drei Nachkommastellen von 5/3 sind .666.


Dies funktioniert, weil "moving 5 eine Stelle über" das gleiche wie "um 10 multipliziert" ist, und Multiplikation/Division sind kommutativ (die Reihenfolge getauscht werden können, um), so (5 * 1000)/3 = (5/3) * 1000 = 1.6666... * 1000 = 1666.666... .

Mit anderen Worten, Verschiebung von 5 über ein paar Ziffern und Division durch 3 ist das gleiche wie Verschiebung (5/3) um ein paar Ziffern.