剑指offer48:不用加减乘除做加法

2019-08-29 08:56:12来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

剑指offer48:不用加减乘除做加法

1 题目描述

  写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

2 思路和方法

  位运算符:两个数异或(^)【1^0=1, 1^1=0, 0^0=0, 0^1=1, 5^5=0, 5^0=5】,相当于每一位相加,而不考虑进位;两个数相与(&)【1&0=0;1&1=1;0&0=0】,并左移一位,相当于求得进位;将上述两步的结果相加。

  我们可以用三步走的方式计算二进制值相加: 5-101,7-111

  第一步:异或(^)相加各位的值,不算进位,101^111得到010。
  第二步:相与(&)计算进位值,各位做与操作得到101,再向左移一位得到1010,即(101&111)<<1得到1010。
  第三步重复上述两步, 各位相加 010^1010=1000,进位值为100=(010&1010)<<1。( 010 & 1010 )相当于( 0010 & b1010 ),位数不一样,前面补0。
  继续重复上述两步:各位相加的值=1000^100 = 1100,进位的值=1000^100 = 0000,进位值为0,跳出循环,1100为最终结果 */

3 C++核心代码  

 1 class Solution {
 2 public:
 3     int Add(int num1, int num2)
 4     {
 5         while(num2!=0){
 6             int sum=num1^num2;
 7             num2=(num1&num2)<<1;
 8             num1=sum;
 9         }
10         return num1;
11     }
12 };
View Code

参考资料

https://blog.csdn.net/feng_zhiyu/article/details/82112291


原文链接:https://www.cnblogs.com/wxwhnu/p/11425367.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:qt 旧项目编译运行提示 “启动程序失败,路径或者权限错误?”

下一篇:剑指offer50:数组中重复的数字