位运算实现加减乘除

关于逻辑右移和算术右移

vs中,对于unsigned类型,是逻辑右移,对于signed,算术右移


加法器的实现

对于不考虑进位的加法

0+0=0;1+0=1;0+1=1;1+1=0;即是异或运算

考虑进位

0+0==;1+0=0;0+1=0;1+1=1;即是与运算

以下程序,a即不考虑进位部分,b为进位部分。

int add(int a,int b)
{
	int c = 0;
	while(c = a&b)
	{
		a = a^b;
		b = (c)<<1;
	}
	return (a^b);
}

对于减法,可转换为加法

int rev(int a)
{
	return(1+ ~a);
}

int sub(int a,int b)
{
	return add(a,rev(b));
}

对于乘法

a*5 = a*4+a

以下只实现了正数乘法

int mul( int a, int b ){
	int c = 0x1<<(sizeof(int)*8-1);
	int ret = a;
	while( (c>>=1) && (!(b&c)) );
	while( c >>= 1 ){
		ret <<= 1;
		if( c&b )
			ret = add(ret, a);
	}
	return ret;
}

对于除法

比如12/4

12 -4*2- 4*1 = 0

只要用12减去4的各种2次幂。

以下也只实现了正数的除法

int pos_div(int a,int b)
{
	int temp = 1;
	int ret = 0;
	//a==b
	if(!(a^b)) return 1;
	//a<b
	if(!IsBig(a,b)) return 0;
	//a>b
	while(!IsBig(temp,a)) temp <<=1 ;
	while(IsBig(temp,b))
	{
		ret <<= 1;
		temp >>= 1;
		if(!IsBig(temp,a))
		{
			ret = add(ret,1);
			a = sub(a,temp);
		}
	}
	return ret;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值