不用加减乘除求两个整数之和代码如何实现?

KLQ 2020-04-15 10:42:04 java常见问答 7645

你知道在函数体内不使用加减乘除(+、-、*、/)来做两个整数之和的代码该如何实现吗?下面一起来看看Java代码实现实例和具体的思路吧。

题目:

写一个函数,求两个整数之和。

要求:在函数体内不能够使用+、-、*、/四则运算符号。

思路1:

我们来看看十进制是怎样做的:

5+7=12,三步走

1、相加各位的值,不算进位,得到2。

2、计算进位值,得到10(假如这一步的进位值是0,则第1步得到的值就是最终结果)

3、重复上面的2个步骤,只是相加的值变成上述两步的得到的结果2和10,得到12。

相同的,我们可以用三步走的方式计算二进制值相加:5-101,7-111

1、相加各位的值,不算进位,得到010,二进制每位相加就相当于各位做异或操作,101^111。

2、计算进位值,得到1010,相当于各位做与操作得到101,再向左移一位得到1010,(101&111)<<1。

3、重复上面的2个步骤, 各位相加010^1010=1000,进位值为100=(010&1010)<<1。

重复上面的2个步骤:1000^100=1100,进位值为0,跳出循环,1100为最终结果。

代码实现:

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:

位运算:

一、两个数异或:相当于每一位相加,而不考虑进位;

二、两个数相与,并左移一位:相当于求得进位;

三、将上面2步的结果相加

代码实现:

public int Add(int num1, int num2)
{
    while (num2 != 0)
    {
        int sum = num1 ^ num2;
        int carray = (num1 & num2) << 1;
        num1 = sum;
        num2 = carray;
    }
    return num1;
}

思路3:

通过地址来相加,间接的加法。

代码实现:

class Solution
{
    public:
        int Add(int num1, int num2)
        {
            char * a = reinterpret_cast < char * > (num1);
            return reinterpret_cast < long > ( & (a[num2]));
        }
};

不用加减乘除做加法的代码实现及思路大家都了解了吗?可以依据上面的三个例子和思路作为参考哦。请继续关注本站,有更多的Java实例可以分享给大家。