Während ein signed long long intWille nicht hält A*B, werden zwei von ihnen. Könnte A*Balso in Baumbegriffe verschiedener Exponenten zerlegt werden, von denen jeder zu einem passt signed long long int.
A1=A>>32;
A0=A & 0xffffffff;
B1=B>>32;
B0=B & 0xffffffff;
AB_0=A0*B0;
AB_1=A0*B1+A1*B0;
AB_2=A1*B1;
Gleiches gilt für C*D .
Auf dem geraden Weg könnte die Subtraktion für jedes Paar von AB_iund CD_iebenfalls unter Verwendung eines zusätzlichen Übertragsbits (genau eine 1-Bit-Ganzzahl) für jedes durchgeführt werden. Wenn wir also E = A * BC * D sagen, erhalten Sie so etwas wie:
E_00=AB_0-CD_0
E_01=(AB_0 > CD_0) == (AB_0 - CD_0 < 0) ? 0 : 1 // carry bit if overflow
E_10=AB_1-CD_1
...
Wir fahren fort, indem wir die obere Hälfte von E_10auf übertragen E_20(um 32 verschieben und hinzufügen, dann die obere Hälfte von löschenE_10 ).
Jetzt können Sie das Übertragsbit entfernen, E_11indem Sie es mit dem richtigen Vorzeichen (erhalten vom Nicht-Übertrags-Teil) zu hinzufügen E_20. Wenn dies einen Überlauf auslöst, passt das Ergebnis auch nicht.
E_10hat jetzt genug 'Platz', um die obere Hälfte von E_00 (Shift, Add, Erase) und dem Carry-Bit zu nehmen E_01.
E_10 kann jetzt wieder größer sein, also wiederholen wir die Übertragung an E_20 .
Zu diesem Zeitpunkt E_20muss Null werden, sonst passt das Ergebnis nicht. Die obere Hälfte vonE_10 ist auch aufgrund der Übertragung leer.
Der letzte Schritt besteht darin, die untere Hälfte von E_20in zu übertragenE_10 wieder.
Wenn die Erwartung, E=A*B+C*Ddie passen würde, signed long long intgilt, haben wir jetzt
E_20=0
E_10=0
E_00=E