Der Code, den Sie gefunden haben, versucht zu erklären, wie sehr primitive Computerhardware eine "add" -Anweisung implementieren kann. Ich sage "könnte", weil ich garantieren kann, dass diese Methode von keiner CPU verwendet wird, und ich werde erklären, warum.
Im normalen Leben verwenden Sie Dezimalzahlen und haben gelernt, wie man sie hinzufügt: Um zwei Zahlen hinzuzufügen, fügen Sie die niedrigsten zwei Ziffern hinzu. Wenn das Ergebnis kleiner als 10 ist, notieren Sie das Ergebnis und fahren mit der nächsten Ziffernposition fort. Wenn das Ergebnis 10 oder mehr ist, schreiben Sie das Ergebnis minus 10 auf, fahren mit der nächsten Ziffer fort und kaufen. Denken Sie daran, 1 weitere hinzuzufügen. Zum Beispiel: 23 + 37, Sie addieren 3 + 7 = 10, Sie schreiben 0 auf und denken daran, 1 weitere für die nächste Position hinzuzufügen. An der 10er Position addieren Sie (2 + 3) + 1 = 6 und schreiben das auf. Ergebnis ist 60.
Mit Binärzahlen können Sie genau dasselbe tun. Der Unterschied besteht darin, dass die einzigen Ziffern 0 und 1 sind, sodass die einzig möglichen Summen 0, 1, 2 sind. Bei einer 32-Bit-Zahl würden Sie eine Ziffernposition nach der anderen behandeln. Und so würde es wirklich primitive Computerhardware tun.
Dieser Code funktioniert anders. Sie wissen, dass die Summe zweier Binärziffern 2 ist, wenn beide Ziffern 1 sind. Wenn also beide Ziffern 1 sind, würden Sie an der nächsten Binärposition 1 weitere hinzufügen und 0 aufschreiben. Das ist, was die Berechnung von t bewirkt: Es findet alle Stellen Dabei sind beide Binärziffern 1 (das ist das &) und werden an die nächste Ziffernposition (<< 1) verschoben. Dann wird addiert: 0 + 0 = 0, 0 + 1 = 1, 1 + 0 = 1, 1 + 1 ist 2, aber wir schreiben 0 auf. Das macht der Ausschluss oder Operator.
Aber alle Einsen, die Sie an der nächsten Stelle behandeln mussten, wurden nicht behandelt. Sie müssen noch hinzugefügt werden. Deshalb macht der Code eine Schleife: In der nächsten Iteration werden alle zusätzlichen Einsen hinzugefügt.
Warum macht das kein Prozessor so? Weil es eine Schleife ist und Prozessoren keine Schleifen mögen und es langsam ist. Es ist langsam, da im schlimmsten Fall 32 Iterationen erforderlich sind: Wenn Sie der Zahl 0xffffffff (32 1-Bit) 1 hinzufügen, löscht die erste Iteration Bit 0 von y und setzt x auf 2. Die zweite Iteration löscht Bit 1 von y und setzt x auf 4. Und so weiter. Es dauert 32 Iterationen, um das Ergebnis zu erhalten. Jede Iteration muss jedoch alle Bits von x und y verarbeiten, was viel Hardware erfordert.
Ein primitiver Prozessor erledigt die Dinge genauso schnell wie die Dezimalarithmetik, von der niedrigsten bis zur höchsten Position. Es sind ebenfalls 32 Schritte erforderlich, aber jeder Schritt verarbeitet nur zwei Bits plus einen Wert von der vorherigen Bitposition, sodass die Implementierung viel einfacher ist. Und selbst in einem primitiven Computer kann man es sich leisten, dies zu tun, ohne Schleifen implementieren zu müssen.
Eine moderne, schnelle und komplexe CPU verwendet einen "bedingten Summenaddierer". Insbesondere wenn die Anzahl der Bits hoch ist, beispielsweise ein 64-Bit-Addierer, spart dies viel Zeit.
Ein 64-Bit-Addierer besteht aus zwei Teilen: Erstens einem 32-Bit-Addierer für das niedrigste 32-Bit. Dieser 32-Bit-Addierer erzeugt eine Summe und einen "Übertrag" (ein Indikator dafür, dass der nächsten Bitposition eine 1 hinzugefügt werden muss). Zweitens zwei 32-Bit-Addierer für die höheren 32-Bit: Einer addiert x + y, der andere addiert x + y + 1. Alle drei Addierer arbeiten parallel. Wenn der erste Addierer seinen Übertrag erzeugt hat, wählt die CPU nur aus, welches der beiden Ergebnisse x + y oder x + y + 1 das richtige ist, und Sie haben das vollständige Ergebnis. Ein 64-Bit-Addierer dauert also nur ein kleines bisschen länger als ein 32-Bit-Addierer, nicht doppelt so lang.
Die 32-Bit-Addiererteile werden wieder als bedingte Summenaddierer implementiert, wobei mehrere 16-Bit-Addierer verwendet werden, und die 16-Bit-Addierer sind bedingte Summenaddierer und so weiter.
add
Maschinenanweisungen, die vermutlich alle CPUs haben und als Hardware-Addierer implementiert sind, die in wenigen Takten funktionieren.