用户登录
用户注册

分享至

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

  • 作者: 临汾湿干家
  • 来源: 51数据库
  • 2021-11-07

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

软件
前端设计
程序设计
Java相关