用无符号加法和移位实现除法

#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;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值