Je lis CSAPP et j'essaie de répondre aux questions de devoirs. Supposons que w = 32, 2,75 consiste à obtenir les 32 bits élevés de multiplier deux entiers non signés de 32 bits. Étant donné la fonction int signed_high_prod(int x, int y)
qui calcule les 32 bits de poids fort de x. y pour le cas où x et y sont sous forme de complément à deux. int signed_high_prod(int x, int y)
doit être utilisé pour implémenter unsigned int unsigned_high_prod(unsigned x, unsigned y)
. Par google, j'ai trouvé x'.y' = x.y + x.y_31.2^32 + y.x_31.2^32 + x_31.y_31.2^64
, où x 'et y' sont des formes non signées de x et y respectivement.obtenir les 32 bits élevés de multiplier deux entiers non signés (HW)
Je n'arrive toujours pas à comprendre la réponse.
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;
}
Pourquoi le terme final n'a aucun effet sur le résultat? pourquoi quand x < 0
donc x_31 = 1
, plus y
? et la même chose avec y
.
Si modulo 2³² est effectuée, va se perdre quelques bits? – user2018791
@ user2018791 Pas dans ce cas. Le résultat de la multiplication correspond à 64 bits. La division par 2³², arrondie vers moins l'infini ('floor') nous donne le top 32 bits. Le mod 2³² sur le numéro non signé 32 bits n'a aucun effet sur celui-ci. –
@ user2018791 L'étape mod 2³² à la fin était principalement de montrer que la fonction 'unsigned_high_prod' n'a pas besoin de prendre en compte le terme impliquant N (x) · N (y) · 2³² puisque c'est un multiple de 2³² et donc est égal à 0 mod 2³². Notez que (A mod N) + (B mod N) est le même que (A + B) mod N, donc le mod 2³² aurait pu être fait sur chaque terme individuellement et cela n'aurait pas fait de différence. C'est à dire. '(⌊x · y/2³²⌋ + x · N (y) + y · N (x) + N (x) · N (y) · 2³²) mod 2³²' est égal à ⌊x · y/2³²⌋ mod 2³² + x · N (y) mod 2³² + y · N (x) mod 2³² + N (x) · N (y) · 2³² mod 2³²'. –