欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-10-24 12:56:23
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& ......

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 };

参考资料

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