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

来源:互联网 发布:mac输入法切换 编辑:程序博客网 时间:2024/06/07 08:18
  • 问题描述
    写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
class Solution {public:    int Add(int num1, int num2)    {       }};
  • 分析
    由于不能用四则运算,所以不可避免的,我们还是要用位运算,我们都知道在二进制中:0+0=0,0+1=1,1+0=1,1+1=0,由此可以看出位与位之间的运算结果和异或的结果是一样的,然后考虑进位,对于0+0,0+1,1+0都不会产生进位只有1+1时才产生进位,这与与运算的结果相同。所以对于两个数num1、num2,我们可以先获得二者异或运算的值,然后获取与运算的值(获取各位是否进位的情况),并将其左移一位,然后将获得的值与异或得到的结果继续进行异或(将各进位的值加到未进位的结果上)和与运算并左移的操作,直到与运算并左移的结果为0。例如对于二进制数0111和0101:
    首先进行异或运算得到0010,与运算得0101,左移得0010;
    异或(0010^1010)得1000,与运算得0010,左移得0100;
    异或(1000^0100)得1100,与运算得0000,左移得0000(停止)。
    所以最后结果为1100。
  • 代码
class Solution {public:    int Add(int num1, int num2)    {        int sum,carry;        do{            sum = num1 ^ num2;            carry=(num1&num2)<<1;            num1= sum;            num2=carry;        }while(num2!=0);        return num1;     }};