你知道在函数体内不使用加减乘除(+、-、*、/)来做两个整数之和的代码该如何实现吗?下面一起来看看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实例可以分享给大家。