J’ai deux variables (qui sont en fait des éléments de deux masortingces différentes). Par exemple, je veux multiplier
a[i][k]*b[k][j]
en utilisant la manipulation des bits, comment puis-je faire cela.
J’ai vu des références à des constantes de multiplication, pas des variables comme 3 * 2, 3 * 4, 3 * 8, etc. Mais comment appliquer les mêmes techniques à la multiplication de variables? Si un message sur ce sujet existe, pouvez-vous me le dire? Merci!
La multiplication par décalage de bits est utilisable uniquement en multipliant par une puissance de 2 (2, 4, 8, 16, etc.). La multiplication sera alors réduite à une opération de changement de bit unique:
x1 = 2^n; result = x2 << n; // This is the same as x2 * x1
Pour les cas arbitraires, le moyen le plus efficace est d'utiliser une multiplication normale:
a[i][k]*b[k][j]
Étant donné deux variables intégrales
unsigned X, Y;
Et étant donné un Commodore 64, Apple] [, ou une autre architecture qui ne possède pas sa propre instruction de multiplication, cela multipliera les nombres.
unsigned answer = 0; while ( X ) { answer <<= 1; if ( X & 1 ) answer += Y; X >>= 1; }
Si vous multipliez des masortingces énormes, ce qui compte, c’est un algorithme efficace qui a un bon comportement en cache. Pour C ++, consultez la bibliothèque Eigen . Sur un processeur moderne, vous ne pouvez pas micro-optimiser la multiplication de deux variables.