La multiplication de deux 32 bits sans l'aide de 64 bits int
Nous font 32 bits * 32 bits de multiplication à l'aide de l'algorithme suivant
Laissez-nous nous souhaitons multiplier un (32 bits) avec b (32 bits), tous deux signés,
a = ah * 2^16 + al [ah - Plus de 16 bits, al - 16 bits de poids faible]
b = bh * 2^16 + bl [bh - Plus de 16 bits, bl - 16 bits de poids faible]
Nous sommes en mesure de faire
Résultat = (al * bl) + (((ah * bl) + (al * bh)) * 2^16) + ((ah * bh) * 2 ^ 32) ~~~
Ma question,
Est leur meilleure façon de le faire?
Sur quel processeur? Sur x86 par exemple, lorsque vous avez plusieurs deux 32 bits, la haute 32 bits du résultat est stocké dans EDX, tandis que la basse bits sont dans EAX. Similaire avec 16 bits.
Nous avons besoin de concevoir c'est pour un processeur 32 bits, et le processeur peut être quelque chose comme ARM, MIPS, ou basées sur le client ...
Utilisation int64_t et laisser le compilateur générateur de code inquiéter sur la façon de la mettre en œuvre. Vous avez seulement besoin de faire quelque chose à la main si la codegen est pauvre, ce qui est rare pour un cas simple.
Nous avons besoin de concevoir c'est pour un processeur 32 bits, et le processeur peut être quelque chose comme ARM, MIPS, ou basées sur le client ...
Utilisation int64_t et laisser le compilateur générateur de code inquiéter sur la façon de la mettre en œuvre. Vous avez seulement besoin de faire quelque chose à la main si la codegen est pauvre, ce qui est rare pour un cas simple.
OriginalL'auteur Alphaneo | 2009-08-31
Vous devez vous connecter pour publier un commentaire.
Dans toute intégrer compilateur, l'émulation de 64 bits entiers sur une plate-forme 32 bits sera aussi efficace que de faire de la multi-étape de mathématiques de vous-même. Mais il sera beaucoup plus fiable correcte.
Quand on fait de l'arithmétique simple avec des valeurs assez grandes de déborder, même les plus très à l'écoute de la bibliothèque math que j'ai vu juste utilise int64.
OriginalL'auteur Alan
Google "multiplication de Karatsuba".
OIh, et dans votre code, changement de la constante de 2^15 (il apparaît deux fois) pour les 2^16.
OriginalL'auteur Robert L
La réponse est non il n'y a pas une meilleure façon de faire les choses, en dehors de l'aide de décalage de bits et et masques au lieu de 2^n. À savoir:
D'autre part, sont vos entiers signés ou non signés? Si ils sont signés et puis qui change les choses.
Troisième, je ne suis pas sûr de vos 2^15 est à droite. Si c'est non signé au moins, vous souhaitez déplacer des bits en 16 pas 15.
Enfin, vous avez à regarder dehors pour les dépassement d'entier dans le bas de l'ordre de l'int. Si vous additionnez les nombres dans l'ordre bas int que le trop-plein, c'est la capacité dont vous avez besoin pour correctement incrément d'ordre élevé int.
OriginalL'auteur cletus
Vous avez besoin de savoir (à préciser) comment le 64 bits, la valeur est stockée - sans doute, c'est une paire de valeurs de 32 bits, peut-être deux éléments d'un tableau, ou deux éléments d'une structure. Vous devez également tenir compte de la façon dont le signe de l'information est stockée dans le résultat.
Mécaniquement, vous voulez probablement pour convertir les deux signé des valeurs non signées, et ensuite faire la distinction et de remonter le long des lignes que vous avez montré, en faisant attention à ce que la porte de la faible valeur de 32 bits sont gérés correctement dans la haute valeur de 32 bits.
En fonction de vos premières décisions de conception, vous pouvez aussi avoir besoin de fettle la représentation du signe du résultat, et peut-être même tous les autres bits.
Des commentaires similaires s'appliquent à la multiplication de deux nombres 16 bits sans 32 bits résultats, quelque chose qui était à la fois important, mais la plupart des gens n'ont pas à s'inquiéter.
OriginalL'auteur Jonathan Leffler