剑指Offer——不用加减乘除做加法
题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
输入为num1和num2
方法
不能用+-*/,那么只能用位运算来进行计算,可以把二进制像十进制加法一样,按位相加,满2进1,然后可以发现:
按位相加时,0和1相加等于1,0和0、1和1相加等于1,与^运算的结果相同,因此可以使用^运算得到相加结果(不考虑进位情况下)记为sum = num1 ^ num2;
考虑进位情况,只有在1和1相加时才会产生进位,0和0、0和1相加并不会,则该结果与&运算得到的结果相同,可以使用&运算得到进位情况记为,但进位通常是和左边的一位进行相加,所以需要对得到的结果进行左移,则进位情况carry = (num1 & num2) << 1;
得到sum和carry后,将两者相加即为所需的结果,那么就可以令num1 = sum,num2 = carry,重复前面两个步骤,直到不产生进位为止。
代码
class Solution {
public:
int Add(int num1, int num2)
{
while( num2 )
{
int sum = num1 ^ num2;
int carry = (num1 & num2) << 1;
num1 = sum;
num2 = carry;
}
return num1;
}
};
---------------------
作者:qq_36132127
来源:CSDN
原文:https://blog.csdn.net/qq_36132127/article/details/81253515
版权声明:本文为博主原创文章,转载请附上博文链接!

浙公网安备 33010602011771号