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

来源:互联网 发布:php strcmp返回值 编辑:程序博客网 时间:2024/06/01 20:48

#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

原创粉丝点击