ce ptit prog vous sort la version shiftée d'une multiplication ou division:
#include <stdio.h>
#include <conio.h>
#define abso(X) (X>0?X:-X)
void main()
{
int i;
char *var="variable",op,*shift="<<";
int num,roll[]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304};
clrscr();
printf("operation a faire?(VAR * NB ou VAR / NB):")
scanf("%s %c %d",var,&op,&num);
if(op=='/')shift=">>";
while(num)
{
for(i=0;i<22;i++)
{
if(abso(num)==roll[i])
{
//printf("%d est egal … %d",num,roll[i]);
if(num>0)
{
num-=roll[i];
printf("+(%s%s%d)",var,shift,i);
}
else
{
num+=roll[i];
printf("-(%s%s%d)",var,shift,i);
}
break;
}
if((abso(num)>roll[i])&&(abso(num)<roll[i+1]))
{
//printf("non est bien entre %d et %d",roll[i],roll[i+1]);
if((roll[i+1]-abso(num))>(roll[i]-abso(num)))
{
//printf("n%d est plus pres",roll[i+1]);
if(num>0)
{
num-=roll[i+1];
printf("+(%s%s%d)",var,shift,i+1);
}
else
{
num+=roll[i+1];
printf("-(%s%s%d)",var,shift,i+1);
}
}
else
{
//printf("n%d est plus pres",roll[i]);
if(num>0)
{
num-=roll[i];
printf("+(%s%s%d)",var,shift,i);
}
else
{
num+=roll[i];
printf("-(%s%s%d)",var,shift,i);
}
}
}
}
}
getch();
}


