网站首页
网站导航
Ctrl+D收藏
首 页
代码段
源码包
文档库
工具箱
代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
C/C++
】
用位运算实现两个整数的加减乘除
作者:
/ 发布于
2016/9/20
/
342
#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 */
评论列表
本站所提供的代码,版权归原作者所有,若有侵犯作者版权,请与我们联系,我们将立即删除或修改。谢谢!
本站所有代码发布及提供者。
试试其它关键字
同语言下
.
C分鱼问题
.
链表
.
最大连续和
.
编码字符串
.
libiconv字符编码处理及判断字符串是否为utf8
.
一组数中两两二元组,差最大有几对,差最小呢?(数组
.
通过管道获取一个进程的执行状态
.
多关键字排序
.
字符串字典序排序
.
3元一次方程(牛顿迭代法求方程的根)
可能有用的
.
C分鱼问题
.
链表
.
最大连续和
.
编码字符串
.
libiconv字符编码处理及判断字符串是否为utf8
.
一组数中两两二元组,差最大有几对,差最小呢?(数组
.
通过管道获取一个进程的执行状态
.
多关键字排序
.
字符串字典序排序
.
3元一次方程(牛顿迭代法求方程的根)
贡献的其它代码
Label
地图
本站
我们
服务
版权
联系
回馈
博客