题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
思路
- 位运算:
两个数异或:相当于每一位相加,不考虑进位;
两个数相与,并左移一位,相当于求得进位;
代码
package nowcoder;
/*
* 48: 不用加减乘除做加法
*/
public class AddExceptOperator {
public static void main(String []args) {
int a = 10;
int b = 20;
System.out.println(add(a,b));
}
public static int add(int a, int b) {
while(b != 0) {
int sum = a ^ b;
int carray = (a & b) << 1;
a = sum;
b = carray;
}
return a;
}
}
13 的二进制 1 1 0 1 -----a 13
11 的二进制 1 0 1 1 -----b 11
-
第一轮:
a^b
->0 1 1 0
-----d 6
(a&b)<<1
->1 0 0 1 0
-----e 18 -
第二轮:
d^e
->1 0 1 0 0
-----f 20
(d&e)<<1
->0 0 1 0 0
------g 4 -
第三轮:
(f&g)<<1
->0 1 0 0 0
------h 8
f^g
->1 0 0 0 0
------i 16 -
第四轮:
h^i
->1 1 0 0 0
------i 24
(h&i)<<1
->0 0 0 0 0
------h 0