#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. Spring Boot入门样例-001-Java和Maven安装配置

    Spring Boot入门样例-001-Java和Maven安装配置 本文说明Java和Maven在windows下的安装和配置 前言 本Spring Boot入门样例准备工作参考: Spring B ...

  2. javaWeb-监听器Listener

    监听器Listener (一)监听器Listener javaEE包括13门规范 在课程中主要学习 servlet技术 和 jsp技术 其中 servlet规范包括三个技术点:servlet  lis ...

  3. 解决CSocket高数据传输问题

    这个是自己项目中发现的问题,所以这个不一定适用于你的. 仅供参考. 头文件: ESSocket.h // ESSocket.h : header file // #ifndef ESSOCKET_H ...

  4. m邻接

    <冈萨雷斯 数字图像处理(第三版)> http://www.cnblogs.com/liugl7/p/5249453.html http://www.cnblogs.com/carfiel ...

  5. vue项目 安装和配置sass & main.js引入scss文件报错

    通过npm 安装 cnpm install --save-dev sass-loader cnpm install --save-dev node-sass 在build文件夹下的webpack.ba ...

  6. IntelliJ IDEA 17 创建maven项目

    参考博客: https://yq.aliyun.com/articles/111053# 部署服务器时  没有Tomcat Server选项

  7. mysql8忘记密码的解决方法

    mysql8忘记密码的解决方法 1.管理员身份打开cmd,进入dos 2.停止mysql服务 命令:net stop mysql 3.无密码启动 命令:mysqld --console --skip- ...

  8. Leetcode605.Can Place Flowers种花问题

    假设你有一个很长的花坛,一部分地块种植了花,另一部分却没有.可是,花卉不能种植在相邻的地块上,它们会争夺水源,两者都会死去. 给定一个花坛(表示为一个数组包含0和1,其中0表示没种植花,1表示种植了花 ...

  9. pycharm使用gitlab输错密码解决办法

    在pycharm中使用http方式连接gitlab,在测试连接的时候提示输入用户名,密码.密码输错后,以后的每次test都是使用错误的密码,在删除pycharm后也是一样,解决方法是在控制面板\用户帐 ...

  10. ubuntu上安装nodejs和npm

    在使用npm时,特别注意nodejs的版本问题. 一般选择源码安装