#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++】位运算实现加减乘除的更多相关文章

  1. Java位运算实现加减乘除

    一.加法 a+b 举例实现:13+9=22 13+9不考虑进位结果为12 只考虑进位结果为10 和刚好是22. 13二进制为1101,9二进制为1001. 不考虑进位结果为0100.算式为a^b 只考 ...

  2. 用Java位运算实现加减乘除四则运算

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6412875.html 感谢博客:http://blog.csdn.net/itismelzp/article/ ...

  3. Java位运算实现加减乘除四则运算

    本文是继<一文了解有趣的位运算>的第二篇文章. 我们知道,计算机最基本的操作单元是字节(byte),一个字节由8个位(bit)组成,一个位只能存储一个0或1,其实也就是高低电平.无论多么复 ...

  4. 位运算实现加减乘除四则运算(Java)

    [本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 本文是继< ...

  5. 用位运算实现四则运算之加减乘除(用位运算求一个数的1/3) via Hackbuteer1

    转自:http://blog.csdn.net/hackbuteer1/article/details/7390093 ^: 按位异或:&:按位与: | :按位或 计算机系统中,数值一律用补码 ...

  6. php实现不用加减乘除号做加法(1、善于寻找资源:去搜为什么位运算可以实现加法,里面讲的肯定要详细一万倍)

    php实现不用加减乘除号做加法(1.善于寻找资源:去搜为什么位运算可以实现加法,里面讲的肯定要详细一万倍) 一.总结 1.善于寻找资源:去搜为什么位运算可以实现加法,里面讲的肯定要详细一万倍 二.ph ...

  7. 剑指offer-面试题65-不用加减乘除做加法-位运算

    /* 题目: 在不使用加减乘除的前提下,计算两个整数之和. 思路: 不能使用加减乘除则只能考虑位运算. x=num1^num2,则为抹掉进位的结果. y=num1&num2,为只有进位的结果. ...

  8. 使用位运算实现int32位 整数的加减乘除

    我觉得比较难想的是加法吧. 首先加法,脑海中脑补二进制加法,相同位相加,超过2 ,则进1,留0 那么用位运算怎么实现呢?其实理解了异或和与操作,就很容易想出来了. 我觉得异或操作和与操作完全就是实现加 ...

  9. Java位运算总结:位运算用途广泛《转》

    前天几天研究了下JDK的Collection接口,本来准备接着研究Map接口,可是一查看HashMap类源码傻眼咯,到处是位运算实现,所以我觉得还是有必要先补补位运算知识,不然代码看起来有点费力.今天 ...

随机推荐

  1. Python学习 备注

    python 3.x中urllib库和urilib2库合并成了urllib库..其中urllib2.urlopen()变成了urllib.request.urlopen() urllib2.Reque ...

  2. python-基础-函数-局部和全局变量

    1 函数的定义和调用 1.1 函数定义 1.2 函数的调用 2 函数参数 >>> def fun(a, b, *args, **kwargs): ... ""&q ...

  3. 2019-8-8-WPF-非客户区的触摸和鼠标点击响应

    title author date CreateTime categories WPF 非客户区的触摸和鼠标点击响应 lindexi 2019-08-08 16:48:31 +0800 2019-07 ...

  4. 入门servlet:request获取请求体数据

    @WebServlet("/RequestDemo5") public class RequestDemo5 extends HttpServlet { protected voi ...

  5. kuangbin带我飞QAQ 最短路

    1. poj 1502 Mathches Game 裸最短路 #include <iostream> #include <string.h> #include <cstd ...

  6. Web前端浏览器兼容性个人经验总结

    前言 浏览器兼容是前端开发人员必须掌握的一个技能,但是初入前端的同学或者其他后台web开发同学往往容易选择忽略,而形成两个极端: 我最开始都是使用IE6,IE6上没问题,其它浏览器坑爹(多出现与前端后 ...

  7. maven安装教程(Idea)

    下载网址:https://maven.apache.or 点击Download 根据需要下载需要的版本 1.解压下载好的安装包放入新创建的maven文件夹中 2.在系统变量中添加环境变量(建议改成M2 ...

  8. Robbin负载均衡

    Robbin是在Spring Cloud中的一个组件,是由Netfix发布的负载均衡器,有助于控制HTTP和TCP客户端的行为.它给我们提供了默认的轮询.随机等负载均衡算法.同时也可以由我们定义自己的 ...

  9. js点击复制文本

    // 动态创建 input 元素 var aux = document.createElement("input"); // 获得需要复制的内容 aux.setAttribute( ...

  10. BZOJ4719[NOIP2016提高组Day1T2] 天天爱跑步

    #261. [NOIP2016]天天爱跑步 描述 提交 自定义测试 小C同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家 ...