原题为华为的一道面试题
#include <stdio.h>
int add (int a,int b) { int i=0,j=0,c=0; for(i=0,j=0;i<31;++i) { if( ((a&1) & (b&1)) | ((a&1) & (j)) | ((b&1) & (j)) ) { if( (a&1) & (b&1) & j) c|=0x40000000; j=1; } else { if( (a&1) | (b&1) | j) c|=0x40000000; j=0; } if(i<30) { c>>=1; a>>=1; b>>=1; }
} a>>=1; b>>=1; if(j^(a&1)^(b&1)) c|=0x80000000;
return c; }
int sub (int a,int b) { return add(a,add(~b,1)); }
int mul(int a,int b) { int sign=(((a&0x80000000) ^ (b&0x80000000)) >>31) & 0x00000001; if(a<0) a=add(~a,1); if(b<0) b=add(~b,1); int c=0; while(b>0) { if(b&1) { c=add(c,a); b=sub(b,1); } else { a<<=1; b>>=1; } } if(sign) c=add(~c,1);
return c; }
void div(int a,int b) { int sign=(((a&0x80000000) ^ (b&0x80000000)) >>31) & 0x00000001; if(a<0) a=add(~a,1); if(b<0) b=add(~b,1); if(sign && a!=0) printf("-"); int i=0; while(a>=b) { a=sub(a,b); i=add(i,1); } printf("%d",i); if(a!=0) { printf("."); a=mul(a,10); i=0; while(a>=b) { a=sub(a,b); i=add(i,1); } printf("%d",i); } }

|