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

来源:互联网 发布:嵌入式单片机 编辑:程序博客网 时间:2024/06/05 20:51

题目描述

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

1.非递归

思路:本道题用一个例子讲解可能会更为清晰点。现举5+7=12的例子来说明
1.将两个数字转化为二进制:5:0101        7:0111,将两个数做异或操作(即相当于加法的不进位操作)
        5^7=0101^0111=0101
2.计算进位值,将两数做相与操作,如果出现1,即说明原来两个数对应位都为1,应该进位 了。因此向左移一位。
        即:100=(010&1010)<<1。
3.如果进位不为0,那么继续操作。即:0010^1010=1000,进位值为100=(0010&1010)<<1。
        进位为0,退出:1000^0100=1100,    进位值:1000&0100=0            
        输出相与结果:1100=12
public class Solution {    public int Add(int num1,int num2) {        while(num2!=0){            int temp=num1^num2;//两数的和,没有进位            num2=(num1&num2)<<1;//控制进位的操作            num1=temp;        }        return num1;    }}

2.递归

public class Solution {    public int Add(int num1,int num2) {        if(num1==0)return num2;        if(num2==0)return num1;        else            return Add(num1^num2,(num1&num2)<<1);    }}


原创粉丝点击