Ich lese CSAPP und versuche, die Hausaufgaben Fragen zu vervollständigen. Nehmen wir an, w = 32, 2.75 geht es darum, die hohen 32 Bits durch Multiplikation von zwei 32-Bit-Ganzzahlen mit Vorzeichen zu erhalten. Gegeben die Funktion int signed_high_prod(int x, int y)
, die die 32 Bits höherer Ordnung von x berechnet. y für den Fall, dass x und y in Zweierkomplementform vorliegen. int signed_high_prod(int x, int y)
sollte bei der Implementierung unsigned int unsigned_high_prod(unsigned x, unsigned y)
verwendet werden.Holen Sie sich die 32 hohen Bits multipliziert zwei vorzeichenlose Ganzzahlen (HW)
Durch Googeln fand ich x'.y' = x.y + x.y_31.2^32 + y.x_31.2^32 + x_31.y_31.2^64
, wobei x 'und y' sind vorzeichenlose Form von x und y jeweils.
Ich kann immer noch nicht die Antwort verstehen.
unsigned unsigned_high_prod(unsigned x, unsigned y){
unsigned p = (unsigned) signed_high_prod((int) x, (int) y)
if((int) x < 0){
p += y;
}
if((int) y < 0){
p += x;
}
return p;
}
Warum die letzte Amtszeit keine Auswirkungen des Ergebnisses hat? warum wenn x < 0
so x_31 = 1
, plus y
? und das gleiche mit y
.
Wenn Modulo 2² durchgeführt wird, erhalten einige Bits verloren? – user2018791
@ user2018791 Nicht in diesem Fall. Das Ergebnis der Multiplikation passt in 64 Bits. Die Division um 2³², abgerundet in Richtung Minus-Unendlichkeit ('Stock'), gibt uns die oberen 32 Bits. Der Mod 2³² auf der 32-Bit, vorzeichenlosen Nummer hat keine Auswirkung auf ihn. –
@ user2018791 Der Mod 2³²-Schritt am Ende sollte hauptsächlich zeigen, dass die Funktion "unsigned_high_prod" den Begriff N (x) · N (y) · 2³² nicht berücksichtigen muss, da es ein Vielfaches von 2³² und so ist gleich 0 mod 2³². Beachten Sie, dass (A mod N) + (B mod N) dasselbe wie (A + B) mod N ist, so dass der Mod 2³² für jeden Term einzeln ausgeführt werden könnte und es keinen Unterschied gemacht hätte. I.e. (⌊x · y/2³² + x · N (y) + y · N (x) + N (x) · N (y) · 2³²) mod²³² & supmin; ist gleich & ge; x · y/2³² & sup0; mod²³² + x N (y) mod 2³² + y N (x) mod 2³² + N (x) N (y) 2³² mod²²². –