用位运算实现两个整数的加减乘除
来源:互联网 发布: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
- 用位运算实现两个整数的加减乘除运算
- 用位运算实现两个整数的加减乘除运算
- 用位运算实现两个整数的加减乘除运算
- 用位运算实现两个整数的加减乘除运算
- 用位运算实现两个整数的加减乘除运算
- 用位运算实现两个整数的加减乘除运算
- 用位运算实现两个整数的加减乘除运算
- 用位运算实现两个整数的加减乘除运算
- 用位运算实现两个整数的加减乘除运算
- 用位运算实现两个整数的加减乘除
- 用位运算实现两个整数的加减乘除
- 用位运算实现两个整数的加减乘除
- 用位运算实现整数的加减乘除运算
- 位运算实现整数的加减乘除
- 位运算实现整数加减乘除
- 位运算---只使用位运算实现整数的加减乘除
- 只用位运算实现整数的加减乘除运算
- 只用位运算实现整数的加减乘除运算
- 【分治】求第k小值
- JAVA线程dump的分析 --- jstack pid
- java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.Config
- PowerDesigner生成数据库脚本的方法
- Putty的ppk文件转成Xshell使用的key文件
- 用位运算实现两个整数的加减乘除
- 1024学习记录
- linux安装配置mysql
- FormatMessage
- 今天我又回到了这片土地,这里承载着我太多的回忆。264
- 使用类:vector类来模拟随机行走
- 杭州好玩景点攻略76
- 静态存储区 存储时地址由低向高
- java、c\c++的函数比较