- 题目
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
- 思路(加法)
结论性思路:
1.不考虑进位------>a^b就是正确答案。其中^是异或操作,即相同=0,不同=1
举例1:0+1=1
二进制:0000+ 0001=0001 0^1=1
举例2:7+5=12
不进位情况下,7+5个位数为2,0111^0101=0010 换成十进制也就是2
2.只算进位的情况下,即a+b进位时产生的值是什么时------>(a&b)<<1
举例:7+5=12
进位情况下,7+5十位数为10,0111&0101=0101 0101<<1=1010 换成十进制也就是10
- 以7+5为例
1)0111^0101=0010=2 0111&0101=0101<<1=1010=10
2) 0010^1010=1000=8 0010&1010=0010<<1=0100=4
3) 1000^0100=1100=12 1000&0100=0000<<1=0000=0
当(a&b)<<1最终=0时停止,最后得到结果12
- 代码(加法的实现)
public class Solution {
public int add(int num1,int num2) {
int sum = num1;
while(num2!=0){
sum = num1 ^ num2;
num2 = (num1 & num2)<<1;
num1 = sum;
}
return sum;
}
}
- 思路(减法)
实现a+b,只要实现a+(-b)就可以了
结论性小结:一个数的相反数,是这个数的二进制数表达取反+1(补码)的结果。(即相反数=二进制补码)
- 代码(减法的实现)
//~n是给的数进行取反,之后调用前面给的add函数执行+1的操作,得到的结果相当于-b
public int negNum(int n){
return add(~n, 1);
}
//计算a+(-b)
public int minus(int a, int b){
return add(a, negNum(b));
}