【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类源码傻眼咯,到处是位运算实现,所以我觉得还是有必要先补补位运算知识,不然代码看起来有点费力.今天 ...
随机推荐
- js+php如何实现上传图片
近期有一些朋友,在做上传图片这一块的时候进度卡住了.有个朋友说,我已经在这个问题上浪费了一天了. 确实,对于新手而言,上传图片成了比较复杂的的一个事,今天整理了一下常用的两种方式,让新手轻松掌握上传图 ...
- Java程序员面试题收集(4)
Java面试题和答案JAVA相关基础知识1.面向对象的特征有哪些方面 1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题 ...
- 跟我一起做一个vue的小项目(四)
接下来我们进行的是轮播页面下面的导航页的开发 我们需要的是实现轮播页下面的图标,并且实现轮播效果 这个话,其实基本思路先是渲染出小图标,然后,我们要对页数进行判断,如果图标的个数展示的就是8个,那个这 ...
- 【转载】TSN简介及相关资源
原文:https://blog.csdn.net/u012692537/article/details/86188392 一.简介 1.1 什么是TSN TSN(Time Sensitive Netw ...
- ECS应用管理最佳实践
前言 即使在CloudNative发展如火如荼的当下,ECS应用(直接将应用部署在ECS上,不使用容器)仍然占了相当大的比重,原因主要在于相对容器化应用,ECS应用由于不需要容器的运行时环境和类似K8 ...
- 关于dex 64K 引用限制
1.官方文档 https://developer.android.com/studio/build/multidex 主要内容: 什么是64K限制 编码时如何避免64K 限制 拆分dex避免64K 限 ...
- Wamp Apache 启动失败检测方法
一般情况下,看错误日志就可以解决.如果遇到错误日志看不到的情况,不放试试下面的方法 //无错误日志解决办法cmd命令行切换到C:\wamp\bin\apache\apache2.4.9\bin目录 输 ...
- JQuery--extend的使用
$.extend({a,b,c},{a,bd}); 里面的对象属性如果 存在就替换,如果不存在就添加 var loadData = function (order) { var obj = getPa ...
- web前端学习(四)JavaScript学习笔记部分(6)-- js内置对象
1.JS内置对象-什么是对象 1.1.什么是对象: JavaScript中的所有事物都是对象:字符串.数值.数组.函数 每个对象带有属性和方法 JavaScript允许自定义对象 1.2.自定义对象: ...
- @import vs #import - iOS 7
It's a new feature called Modules or "semantic import". There's more info in the WWDC 2013 ...