JZ48 不用加减乘除做加法**
题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
思路
加法归纳起来就是三步走
比如5+17
(1) 做各个位相加,不进位:12(十位:0+1=1;个位:5+7=12,但是不进位);
(2) 做进位,进位的数是多少(进位是10)
(3)以上两个数相加:12+10=22
对数字做运算,除了四则运算外,就只有位运算了
位运算是对于二进制来说的,,那就来分析一下三步走策略对于二进制是否适用;
5(101)+17(10001)
(1) 各个位相加不进位:10100
(2) 进位:10
(3) 相加:10110
接着将二进制加法用位运算代替
(1) 各个位相加不进位:0+1->1;1+0->1;1+1->0;0+0->0--------->就是异或运算
(2) 进位:只有1,1才有进位,所以可以看成是先位与运算,然后左移一位
(3) 上面两步相加:依然重复前面两步,直到不产生进位
代码
class Solution { public: int Add(int num1, int num2) { int sum,carry; //num是求和,carry是进位 do { sum=num1^num2; carry=(num1&num2)<<1; num1=sum; num2=carry; } while(num2!=0); return num1; } };