#include<stdio.h>
typedef unsigned int us;
/*:10/3=3……1
令商为s=0的和,余数为被除数a的差的和,
i在32~2位时,10>>i都是小于除数的,不进行操作,但是i--;
i=1,(a==10)>>1=5>3(除数)……0:s=s+1<<1=2;a=a-3<<1=4;
i=0,(a==4)>>0=4>3(除数)……0:s=s+1<<0=3;a=a-3<<0=1;
得商为3,余数为1;
30/4=7……2;
同理 i在32~3时,30>>i都是小于除数的,不进行操作,i--;
i=2,(a=30)>>2=7>4(除数)……2:s=s+1<<2=4;a=a-4<<2=14;
i=1,(a==14)>>1=7>4(除数)……0:s=s+1<<1=6;a=a-4<<1=6;
i=0,(a==6)>>0=6>4(除数)……0:s=s+1<<0=7;a=a-4<<0=2;
得商为7,余数为2;
综述,总是存在在这样得关系,可求出商和余数;
*/
int main()
{
us a,b;// a/b
us s=0;
scanf("%d%d",&a,&b);
int i;
for(i=32;i>=0;i--)//int 为32位,那么可移位范围即为0~32;
{
if ((a>>i)>=b)
{
s=s+(1<<i);
us q=~(b<<i)+1;// a=a-(b<<i)变成a=a+q,因为不能用减法;
//事实上这里是a=a-(b<<i)(按照例子的想法来做)但因为只能用加法做
//而在加法器里,当sub=1,就会对(-b)进行~b+1;然后a-b=a+~[b]+1,所以变减法为加法
//即-(b<<i)变成~(b<<i)+1;即是q;
a=a+q;//a=a-(b<<i)变化而来;
}
}
printf("商:%u\n",s);
printf("余数:%u\n",a);
return 0;
}
09-11
2823