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(); }