【C++】位运算实现加减乘除
#include<iostream>
#include<assert.h>
using namespace std; // 位运算实现加减乘除 int myAdd(int num1, int num2)
{
if (num2 == ) return num1;
int sum = , carry = ;
sum = num1 ^ num2; // 按位抑或
carry = (num1 & num2) << ;
return myAdd(sum, carry);
} int myAddIter(int num1, int num2)
{
int ret = ;
while (num2)
{
ret = num1 ^ num2;
num2 = (num1 & num2) << ;
num1 = ret;
}
return ret;
} int myNeg(int num1)
{
// 正数到负数的补码表示: 取反加1
return myAdd(~num1, );
} int myMinus(int num1, int num2)
{
return myAdd(num1, myNeg(num2));
} // (2^0)*k0 + (2^1)*k1 + (2 ^2)*k2 + ... + (2^31)*k31
int myPosMulti(int num1, int num2)
{
int ret = ;
while (num2)
{
if (num2 & ) // 对应当前num2的最低位是1
ret = myAdd(ret, num1);
num1 <<= ; // num1 = num1 * 2
num2 >>= ; // num2的当前位用过了就右移
}
return ret;
} int myMultiply(int num1, int num2)
{
if (num1 >= && num2 >= )
return myPosMulti(num1, num2);
if (num1 < && num2 >= )
return myNeg(myPosMulti(myNeg(num1), num2));
if (num1 >= && num2 < )
return myNeg(myPosMulti(num1, myNeg(num2)));
if (num1 < && num2 < )
return myPosMulti(myNeg(num1), myNeg(num2));
} // 除法就是由乘法的过程逆推,依次减掉(如果x够减的)y^(2^31),y^(2^30),...y^8,y^4,y^2,y^1。减掉相应数量的y就在结果加上相应的数量。
int myPosDiv(int num1, int num2)
{
num1 = num1 > ? num1 : myNeg(num1);
num2 = num2 > ? num2 : myNeg(num2);
if (num1 < num2)
return ;
long long op = num2;
int ret = ;
int flag;
int curBit = ;
assert(num2 != );
while (op <= num1)
{
op <<= ;
++curBit;
}
op >>= ;
--curBit; while (op >= num2)
{
if (num1 >= op)
{
num1 -= op;
ret += << curBit;
}
op >>= ;
--curBit;
}
return ret;
} int myPosDivByMinus(int num1, int num2)
{
int ret = ;
while (num1 >= num2)
{
num1 = myMinus(num1, num2);
ret = myAdd(ret, );
}
return ret;
} int myPosComp(int num1, int num2)
{
bool isZero(int);
int temp = ;
num2 = num1 ^ num2;
if (isZero(num2)) return ;
while (num2 >>= )
temp <<= ;
return temp & num1;
} int myDivide(int num1, int num2)
{
if ((num1 > && num2 > ) || (num1 < && num2 < ))
return myPosDiv(num1, num2);
else
return myNeg(myPosDiv(num1,num2));
} bool isNeg(int num)
{
return num & 0x8000;
} bool isZero(int num)
{
return !(num & 0xFFFF);
} bool isPos(int num)
{
return !(num & 0x8000) && (num & 0xFFFF);
} //int myMod(int a, int b)
//{
//
//} int divide(int dividend, int divisor) {
int ret = ;
long long curDividend, curDivisor, op;
bool flag;
int curBit = ; // 记录商的1在哪一位
if (divisor == ) return INT_MAX; // 往负数方向溢出咋整
if ((dividend < && divisor > ) || (dividend > && divisor < ))
flag = ; // 负数
else
flag = ; curDividend = abs(dividend);
curDivisor = abs(divisor); if (curDividend < curDivisor) return ; op = curDivisor;
while (op <= curDividend)
{
++curBit;
op = op << ;
}
op = op >> ;
--curBit; while (op >= curDivisor)
{
if (curDividend >= op)
{
curDividend -= op;
ret += << curBit;
}
op = op >> ;
--curBit;
} if (flag)
return ret;
return -ret;
} int main()
{
//INT_MIN -2147483648 INT_MIN 2147483647
int a = INT_MAX; //
int b = -;
cout << "myAdd: " << myAdd(a, b) << endl;
cout << "myMinus: " << myMinus(a, b) << endl;
cout << "myMultiply: " << myMultiply(a, b) << endl;
cout << "myDivide: " << myDivide(a, b) << endl;
// -1010369383, -2147483648
cout << "Leetcode: " << divide(-, INT_MIN) << endl;
//cout << "myMod: " << myMod(a, b) << endl;
system("pause");
return ;
}
【C++】位运算实现加减乘除的更多相关文章
- Java位运算实现加减乘除
一.加法 a+b 举例实现:13+9=22 13+9不考虑进位结果为12 只考虑进位结果为10 和刚好是22. 13二进制为1101,9二进制为1001. 不考虑进位结果为0100.算式为a^b 只考 ...
- 用Java位运算实现加减乘除四则运算
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6412875.html 感谢博客:http://blog.csdn.net/itismelzp/article/ ...
- Java位运算实现加减乘除四则运算
本文是继<一文了解有趣的位运算>的第二篇文章. 我们知道,计算机最基本的操作单元是字节(byte),一个字节由8个位(bit)组成,一个位只能存储一个0或1,其实也就是高低电平.无论多么复 ...
- 位运算实现加减乘除四则运算(Java)
[本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 本文是继< ...
- 用位运算实现四则运算之加减乘除(用位运算求一个数的1/3) via Hackbuteer1
转自:http://blog.csdn.net/hackbuteer1/article/details/7390093 ^: 按位异或:&:按位与: | :按位或 计算机系统中,数值一律用补码 ...
- php实现不用加减乘除号做加法(1、善于寻找资源:去搜为什么位运算可以实现加法,里面讲的肯定要详细一万倍)
php实现不用加减乘除号做加法(1.善于寻找资源:去搜为什么位运算可以实现加法,里面讲的肯定要详细一万倍) 一.总结 1.善于寻找资源:去搜为什么位运算可以实现加法,里面讲的肯定要详细一万倍 二.ph ...
- 剑指offer-面试题65-不用加减乘除做加法-位运算
/* 题目: 在不使用加减乘除的前提下,计算两个整数之和. 思路: 不能使用加减乘除则只能考虑位运算. x=num1^num2,则为抹掉进位的结果. y=num1&num2,为只有进位的结果. ...
- 使用位运算实现int32位 整数的加减乘除
我觉得比较难想的是加法吧. 首先加法,脑海中脑补二进制加法,相同位相加,超过2 ,则进1,留0 那么用位运算怎么实现呢?其实理解了异或和与操作,就很容易想出来了. 我觉得异或操作和与操作完全就是实现加 ...
- Java位运算总结:位运算用途广泛《转》
前天几天研究了下JDK的Collection接口,本来准备接着研究Map接口,可是一查看HashMap类源码傻眼咯,到处是位运算实现,所以我觉得还是有必要先补补位运算知识,不然代码看起来有点费力.今天 ...
随机推荐
- line-height:2和line-height:2em的区别,它们是有区别的
line-height:2是2倍的意思,如果内部有不同大小文字的情况下,以最大文字为倍数. line-height:2em也是2倍文字大小的意思,但如果内部有大文字,它还是会以父容 器的大小来计算. ...
- eureka注册中心设置用户名密码
1.加入安全认证依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId ...
- 微服务开源生态报告 No.10
「微服务开源生态报告」,汇集各个开源项目近期的社区动态,帮助开发者们更高效的了解到各开源项目的最新进展. 社区动态包括,但不限于:版本发布.人员动态.项目动态和规划.培训和活动. 非常欢迎国内其他微服 ...
- 使用pdf.js在移动端预览pdf文档
pdf.js 是一个技术原型主要用于在 HTML5 平台上展示 PDF 文档,无需任何本地技术支持. 在线演示地址:http://mozilla.github.com/pdf.js/web/viewe ...
- 惊!VUE居然数据不能驱动视图?$set详细教程
众所周知.VUE最大的优点就是数据驱动视图.当数据发生改变时,会监听到变化,后渲染到页面上.那么为什么当我们在修改data中声明的数组或对象时.VUE并没有监听到变化呢?这个我也不知道.我们可以后续再 ...
- 7 个令人兴奋的 JavaScript 新特性
前言 一个ECMAScript标准的制作过程,包含了Stage 0到Stage 4五个阶段,每个阶段提交至下一阶段都需要TC39审批通过.本文介绍这些新特性处于Stage 3或者Stage 4阶段,这 ...
- Kubernetes 基于 ubuntu18.04 手工部署 (k8s)
由于工作的需要, 手工部署一个 Kubernetes 环境(k8s).(以前都是云上搞定,拿来用) 习惯把这种工作记录下来,自己备查也和别人分享 网上相关文章很多, 我也参考了很多,这里推荐一个 链接 ...
- 使用Httpclient 完美解决服务端跨域问题
项目需求: jsonp是从前台js的角度考虑,通过Ajax调用springMVC的接口.同一个ip.同一个网络协议.同一个端口,三者都满足就是同一个域,否则就是跨域问题了.首页广告需要一个轮播的效果, ...
- wordpress主题之后台菜单编辑,小工具
1一:菜单编辑 在functions.php 文件加入 if (function_exists('register_nav_menus')) { register_nav_menus(array( / ...
- 未加星标 ajax三级联动的实现方法
<div id="sanji"></div> 下面考虑的是要有省市区这三列,这三列用的是下拉列表,那么里面要用<option></opti ...