Je suis venu ici à la recherche de cette question et je trouve la réponse de Zengr correcte. Merci Zengr! Mais il y a une modification que je voudrais voir qui se débarrasse de l'opérateur '+' dans son code. Ceci devrait faire la multiplication de deux nombres arbitraires en utilisant AUCUN OPÉRATEUR ARITHMÉTIQUE mais tous les bits.
solution de Zengr première:
#include<stdio.h>
main()
{
int a,b,result;
printf("nEnter the numbers to be multiplied :");
scanf("%d%d",&a,&b); // a>b
result=0;
while(b != 0) // Iterate the loop till b==0
{
if (b&01) // Bitwise & of the value of b with 01
{
result=result+a; // Add a to result if b is odd .
}
a<<=1; // Left shifting the value contained in 'a' by 1
// multiplies a by 2 for each loop
b>>=1; // Right shifting the value contained in 'b' by 1.
}
printf("nResult:%d",result);
}
Ma réponse est:
#include<stdio.h>
main()
{
int a,b,result;
printf("nEnter the numbers to be multiplied :");
scanf("%d%d",&a,&b); // a>b
result=0;
while(b != 0) // Iterate the loop till b==0
{
if (b&01) // Bitwise & of the value of b with 01
{
result=add(result,a); // Add a to result if b is odd .
}
a<<=1; // Left shifting the value contained in 'a' by 1
// multiplies a by 2 for each loop
b>>=1; // Right shifting the value contained in 'b' by 1.
}
printf("nResult:%d",result);
}
où je voudrais écrire ajouter() comme:
int Add(int x, int y)
{
// Iterate till there is no carry
while (y != 0)
{
// carry now contains common set bits of x and y
int carry = x & y;
// Sum of bits of x and y where at least one of the bits is not set
x = x^y;
// Carry is shifted by one so that adding it to x gives the required sum
y = carry << 1;
}
return x;
}
ou en ajoutant récursive comme:
int Add(int x, int y)
{
if (y == 0)
return x;
else
return Add(x^y, (x & y) << 1);
}
source pour le code additionnel: http://www.geeksforgeeks.org/add-two-numbers-without-using-arithmetic-operators/
Faut-il prendre des entiers arbitraires? Il existe un moyen facile d'implémenter la multiplication si l'un des opérandes doit être une puissance de deux. En outre, est-ce une tâche de devoir ou essayez-vous d'implémenter la multiplication dans l'assemblée sur un processeur avec un jeu d'instruction qui n'inclut pas la multiplication (ou les deux)? –
puissance de deux mise en œuvre est facile, mais dans ce cas, les entiers ne sont pas la puissance de deux, ils sont arbitraires. Et ce n'est pas une question de devoirs, c'est une question d'entrevue. S'il vous plaît vérifier la mise en œuvre que j'ai attaché. – SuperMan
Le lien dans la question n'existe pas –