不用加减乘除做加法
描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
这里就要位运算了,首先来了解下四个位运算符。
^
异或运算,两个位相同则为 0,不同则为 1。- 可用于计算 将整数A转换为B,需要改变多少个bit位
- 可用于数组中,只有一个数出现一次,剩下都出现两次,找出出现一次的数
1 0 0 1 1
^ 1 1 0 0 1
-----------------------------
0 1 0 1 0
&
与运算。两位同为 1 才为 1 。否者为0.- 可用于检测是否是2的次幂。
- 可用于统计二进制数中存在多少个1.
>>
和<<
。左移或右移进位。
之后看本题,做加法,需要考虑进位,就分为两种情况。
- 两位都是 1,需要进位。
- 否者直接相加。
所以可以
- 通过
^
运算统计出哪些二进制位只有一个1,无需进位。 - 通过
&
查看哪些二进制位都是1,需要进位1位。 - 循环处理,直到没有进位位了。
实现:
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;
}