//注意,对于int 型, 左移没事,右移注意符号位,应改为unsigned int
int add(int a,int b)
{
int c;
while(c=a&b)//保留当前要进位的位, 为0表示无进位
{
a = a^b;//异或是无进位的加法
b=c<<1; //左移相当于进位
}
return a^b;//无进位则异或等同于加法
}
int mul(int a,int b)
{
int c, i;
c= 0;//累加器
for( i =0; i<32 ;i++)
{
if(b&(1<<i))
c = add(c , a << i)
}
}
int minus(int a, int b)
{
return add(a,-b);
}
//循环移n位 a = (a<<n)||(a>>32-n) 注意是逻辑右移
unsigned int int_p(unsigned int a ,unsigned int b)
{
int i;
unsigned int m=0;
for(i=1;i<=32; i=add(i,1))// i++也用到了加法呢
{
m = m<<1 | a>>31; //把a左移进m直到 m >= b, 则可商1
a = a<<1;
if( m >= b)
{
m = minus(m,b);
a = add(a , 1);
}
}
return a;
}