• (剑指Offer)面试题47:不用加减乘除做加法


    题目:

    写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

    思路:

    很容易想到通过位运算来解决问题。

    以5+17=22为例,参考十进制加法:1、只做各位相加不进位运算,即得到12,;2、做进位运算,即得到10,;3、把前面两个结果先相加,即得到22;

    同样二进制加法也一样:

    1、两个整数做异或^运算,得到各位相加不进位的运算结果;

    2、两个整数做与&运算,然后再左移一位,即得到进位的运算结果;

    3、将上面两个结果相加,即重复步骤1,2,直至进位的运算结果为0;

    类似题目:

    用链表表示十进制数,从链首到链尾,每个结点依次存放十进制从高位到低位上的数字,求两个链表的和,和还是用链表表示;

    代码:

    // non-recursive
    int BitAdd(int num1,int num2){
        int sum=0,carry=0;
        while(num2!=0){
            sum=num1^num2;
            carry=(num1&num2)<<1;
            num1=sum;
            num2=carry;
        }
        return num1;
    }
    
    
    // recursive
    int BitAdd_1(int &num1,int &num2){
        if(num2==0)
            return num1;
        if(num1==0)
            return num2;
        int sum=num1^num2;
        int carry=(num1&num2)<<1;
        return BitAdd(sum,carry);
    }
    
    
    int main()
    {
        int num1=99;
        int num2=99;
        cout << BitAdd(num1,num2) <<endl;
        cout << BitAdd_1(num1,num2) << endl;
        return 0;
    }
    

    在线测试OJ:

    http://www.nowcoder.com/books/coding-interviews/59ac416b4b944300b617d4f7f111b215?rp=2

    AC代码:

    class Solution {
    public:
        int Add(int num1, int num2)
        {
    		int sum=0,carry=0;
            
            while(num2!=0){
                sum=num1^num2;
                carry=(num1&num2)<<1;
                
                num1=sum;
                num2=carry;
            }
            
            return num1;
        }
    };
  • 相关阅读:
    条件概率-独立事件-互斥事件-对立事件
    数学
    可视化:svg相关基础
    移动端调用摄像头(相机)相册
    移动端的事件点透及原因
    ios滑动流畅(丝般顺滑)滚动
    动画框架基础部分
    css美化select标签,兼容ie10 ie10+,chrome。但不支持ie9 ie9-
    ie11 调试工具不能使用
    css使用
  • 原文地址:https://www.cnblogs.com/AndyJee/p/4690680.html
Copyright © 2020-2023  润新知