1 #include<iostream>
  2 #include<assert.h>
  3 using namespace std;
  4
  5 // 位运算实现加减乘除
  6
  7 int myAdd(int num1, int num2)
  8 {
  9     if (num2 == 0)    return num1;
 10     int sum = 0, carry = 0;
 11     sum = num1 ^ num2;    // 按位抑或
 12     carry = (num1 & num2) << 1;
 13     return myAdd(sum, carry);
 14 }
 15
 16 int myAddIter(int num1, int num2)
 17 {
 18     int ret = 0;
 19     while (num2)
 20     {
 21         ret = num1 ^ num2;
 22         num2 = (num1 & num2) << 1;
 23         num1 = ret;
 24     }
 25     return ret;
 26 }
 27
 28 int myNeg(int num1)
 29 {
 30     // 正数到负数的补码表示: 取反加1
 31     return myAdd(~num1, 1);
 32 }
 33
 34 int myMinus(int num1, int num2)
 35 {
 36     return myAdd(num1, myNeg(num2));
 37 }
 38
 39 // (2^0)*k0 + (2^1)*k1 + (2 ^2)*k2 + ... + (2^31)*k31
 40 int myPosMulti(int num1, int num2)
 41 {
 42     int ret = 0;
 43     while (num2)
 44     {
 45         if (num2 & 1)    // 对应当前num2的最低位是1
 46             ret = myAdd(ret, num1);
 47         num1 <<= 1;    // num1 = num1 * 2
 48         num2 >>= 1;    // num2的当前位用过了就右移
 49     }
 50     return ret;
 51 }
 52
 53 int myMultiply(int num1, int num2)
 54 {
 55     if (num1 >= 0 && num2 >= 0)
 56         return myPosMulti(num1, num2);
 57     if (num1 < 0 && num2 >= 0)
 58         return myNeg(myPosMulti(myNeg(num1), num2));
 59     if (num1 >= 0 && num2 < 0)
 60         return myNeg(myPosMulti(num1, myNeg(num2)));
 61     if (num1 < 0 && num2 < 0)
 62         return myPosMulti(myNeg(num1), myNeg(num2));
 63 }
 64
 65 // 除法就是由乘法的过程逆推,依次减掉(如果x够减的)y^(2^31),y^(2^30),...y^8,y^4,y^2,y^1。减掉相应数量的y就在结果加上相应的数量。
 66 int myPosDiv(int num1, int num2)
 67 {
 68     num1 = num1 > 0 ? num1 : myNeg(num1);
 69     num2 = num2 > 0 ? num2 : myNeg(num2);
 70     if (num1 < num2)
 71         return 0;
 72     long long op = num2;
 73     int ret = 0;
 74     int flag;
 75     int curBit = 0;
 76     assert(num2 != 0);
 77     while (op <= num1)
 78     {
 79         op <<= 1;
 80         ++curBit;
 81     }
 82     op >>= 1;
 83     --curBit;
 84
 85     while (op >= num2)
 86     {
 87         if (num1 >= op)
 88         {
 89             num1 -= op;
 90             ret += 1 << curBit;
 91         }
 92         op >>= 1;
 93         --curBit;
 94     }
 95     return ret;
 96 }
 97
 98 int myPosDivByMinus(int num1, int num2)
 99 {
100     int ret = 0;
101     while (num1 >= num2)
102     {
103         num1 = myMinus(num1, num2);
104         ret = myAdd(ret, 1);
105     }
106     return ret;
107 }
108
109 int myPosComp(int num1, int num2)
110 {
111     bool isZero(int);
112     int temp = 1;
113     num2 = num1 ^ num2;
114     if (isZero(num2))    return 0;
115     while (num2 >>= 1)
116         temp <<= 1;
117     return temp & num1;
118 }
119
120
121 int myDivide(int num1, int num2)
122 {
123     if ((num1 > 0 && num2 > 0) || (num1 < 0 && num2 < 0))
124         return myPosDiv(num1, num2);
125     else
126         return myNeg(myPosDiv(num1,num2));
127 }
128
129 bool isNeg(int num)
130 {
131     return num & 0x8000;
132 }
133
134 bool isZero(int num)
135 {
136     return !(num & 0xFFFF);
137 }
138
139 bool isPos(int num)
140 {
141     return !(num & 0x8000) && (num & 0xFFFF);
142 }
143
144 //int myMod(int a, int b)
145 //{
146 //
147 //}
148
149 int divide(int dividend, int divisor) {
150     int ret = 0;
151     long long curDividend, curDivisor, op;
152     bool flag;
153     int curBit = 0; // 记录商的1在哪一位
154     if (divisor == 0)   return INT_MAX; // 往负数方向溢出咋整
155     if ((dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0))
156         flag = 0;   // 负数
157     else
158         flag = 1;
159
160     curDividend = abs(dividend);
161     curDivisor = abs(divisor);
162
163     if (curDividend < curDivisor)   return 0;
164
165     op = curDivisor;
166     while (op <= curDividend)
167     {
168         ++curBit;
169         op = op << 1;
170     }
171     op = op >> 1;
172     --curBit;
173
174     while (op >= curDivisor)
175     {
176         if (curDividend >= op)
177         {
178             curDividend -= op;
179             ret += 1 << curBit;
180         }
181         op = op >> 1;
182         --curBit;
183     }
184
185     if (flag)
186         return ret;
187     return -ret;
188 }
189
190 int main()
191 {
192     //INT_MIN -2147483648 INT_MIN 2147483647
193     int a = INT_MAX;    //
194     int b = -1;
195     cout << "myAdd: " << myAdd(a, b) << endl;
196     cout << "myMinus: " << myMinus(a, b) << endl;
197     cout << "myMultiply: " << myMultiply(a, b) << endl;
198     cout << "myDivide: " << myDivide(a, b) << endl;
199     // -1010369383, -2147483648
200     cout << "Leetcode: " << divide(-1010369383, INT_MIN) << endl;
201     //cout << "myMod: " << myMod(a, b) << endl;
202     system("pause");
203     return 1;
204 }

转载于:https://www.cnblogs.com/helloWaston/p/4624607.html

【C++】位运算实现加减乘除相关推荐

  1. C++学习笔记-----用位运算实现加减乘除

    C++学习笔记-----用位运算实现加减乘除 原文:http://blog.csdn.net/sinat_35261315/article/details/72904945 数据在计算机内存中是以二进 ...

  2. java加减_Java位运算实现加减乘除

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

  3. 只使用位运算实现加减乘除

    在线OJ: LeetCode 29. 两数相除 原题目的要求是不能使用乘法, 除法和取余运算符实现除法. 在本篇博客中把题目要求提高一点, 这里只使用位运算来实现, 顺便的也就把只使用位运算实现加减乘 ...

  4. 数学问题——位运算实现加减乘除

    ##位运算实现加减乘除 ###位运算实现加法 public static int add(int a, int b) {int sum = a;while (b != 0) {//不断的相加,直到没有 ...

  5. 用位运算实现加减乘除

    听同学百度二面中,不准用四则运算操作符来实现四则运算.一想就想到了计算机组成原理上学过的.位运算的思想可以应用到很多地方,这里简单的总结一下用位运算来实现整数的四则运算. 加法运算: [cpp] vi ...

  6. Java 实现位运算计算加减乘除

    机器数和机器数的真值 一个数在计算机中的二进制表示形式,叫做这个数的机器数.机器数是带符号的,在计算机用机器数的最高位存放符号,正数为0,负数为1.举个例子,比如在机器字长为8位的情况下(机器字长是指 ...

  7. 位运算实现加减乘除运算

    我们知道,计算机最基本的操作单元是字节(byte),一个字节由8个位(bit)组成,一个位只能存储一个0或1,其实也就是高低电平.无论多么复杂的逻辑.庞大的数据.酷炫的界面,最终体现在计算机最底层都只 ...

  8. java用位运算实现加减乘除

    个人主页:熬夜磕代码丶 作品专栏: java se 我变秃了,也变强了 给大家介绍一款程序员必备刷题平台--牛客网 点击注册一起刷题收获大厂offer吧 文章目录 前言 一.常见位运算 1. & ...

  9. java实现三位数加减乘除_用Java位运算实现加减乘除四则运算

    感谢博客:http://blog.csdn.net/itismelzp/article/details/49621741  提供的思路. 要用位运算来实现四则运算,不仅仅要知道&,|,~,^, ...

最新文章

  1. 第五周 1 素数和(5分)
  2. rf运行python脚本报错_python2.7+RobotFramework的UI自动化环境搭建
  3. hadoop28---netty传对象
  4. EasyWechat中代金券的发放总结
  5. 在数据库技术中脏数据是指_数据库安全关键技术之数据库加密技术
  6. skimage.io.imread(), Image.open() 以及 cv2.imread()的区别
  7. mysql 云主机名_mysql部署到云主机的笔记
  8. 周末包邮送书和小红包中奖名单公布
  9. word实现文献引用2
  10. Excel2007数据透视表学习(一)
  11. 心率 心律 脉率的区别
  12. Redis学习笔记(十)——过期时间、访问限制与缓存
  13. arm2410 linux,ARM2410与Linux开发环境的搭建
  14. 据说200G网盘资料
  15. 最新版 | 2020李沐《动手学深度学习》中文版pdf重磅开源!
  16. 百度移动:静悄悄的战争
  17. 市场监管新规下Android接入的友盟Umeng移动统计/推送/分享SDK过程问题总结
  18. 揭秘!用标准Go语言能写脚本吗?
  19. HYBBS2.3轻论坛M-TOUCH模板源码
  20. 为什么 JSON 不支持注释?

热门文章

  1. 图解TCPIP-TCP IP
  2. pandas 散布矩阵
  3. bracket 教程
  4. date_range
  5. layui option 动态添加_layuiselect如何动态添加option
  6. Exchange邮件跟踪日志不得不了解的知识
  7. matlab中gama,matlab积分结果中的gamma()函数参数问题,急求解答!!!
  8. 2019年2月25日 Range Sum of BST
  9. Eclipse自动生成作者、日期注释功能设置
  10. 原生input和onchange