用位运算实现两个整数的加减乘除

#include <iostream>
#include <cstdio>
using namespace std;

int AddUonRecursive(int a,int b){ // 非递归加法 
	for(int i=1; i; i<<=1)
		if(b&i)
			for(int j=i; j; j<<=1)
				if(a&j) a &= ~j;
				else { a |= j;break; }
	return a;
} 

int AddRecursive(int a,int b){ //递归加法 
	return b ? AddRecursive( a^b, (a&b)<<1 ) : a;
}

int GetReverse(int a){ // 取补码
	int i;
	for(i=1; i&&((a&i)==0); i<<=1);
	for(i<<=1; i; i<<=1) a ^= i;
	return a;
}

int Minus(int a,int b){ //减法 
	//取减数补码 
	b = GetReverse(b);
	return  AddRecursive(a,b);
}

int Multiple(int a,int b){ //乘法 
	int ans = 0;
	for(int i=1; i; i<<=1,a<<=1)
		if(b&i)
			ans = AddRecursive(ans,a);
		return ans;
} 

int Division(int a,int b){ //除法(正负都可以)

	int IsPositive = 1;

	if(a & (1<<31)) { a = GetReverse(a); IsPositive ^= 1;}
	if(b & (1<<31)) { b = GetReverse(b); IsPositive ^= 1;}

	int ans = 0;
	for(int i=31; i>=0; i--){
		if((a>>i) >= b){ //不能这样比较a >= (b << i) 会溢出 
			ans = AddUonRecursive(ans,1<<i);
			a = Minus(a,b<<i);
		}
	}
	return IsPositive ? ans : GetReverse(ans);
} 
int main(){
	
	int a,b;
	while(scanf("%d%d",&a,&b) != EOF){
		printf("非递归加法:%d\n",AddUonRecursive(a,b));
		printf("递归加法:%d\n",AddRecursive(a,b));
		printf("减法:%d\n",Minus(a,b));
		printf("乘法:%d\n",Multiple(a,b));
		printf("除法:%d\n",Division(a,b));
	}
	return 0;
}

/*
6 -2
非递归加法:4
递归加法:4
减法:8
乘法:-12
除法:-3                                                                    
*/

参考: http://blog.csdn.net/walkinginthewind/article/details/6886489

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

__简言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值