Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -.
Example:
Given a = 1 and b = 2, return 3.
不使用“+”、“-”号进行加法运算。
思路:在比特位上模拟进制运算,1和1进位1,1和0(0和1)
位运算的基本知识:
&:与运算,两位都为1时,结果才为1
|:或运算,两位都为0时,结果才为0
^:异或,两位相同为0,相异为1
~:取反,0变为1,1变为0
<<:左移,全部位向左移动若干位,高位丢弃,低位补0:右移,各二进制位全部右移若干位,对无符号位,高位补0,有符号位,各编译器处理的方法不同。
public static int getSum(int a, int b) {
//不运用+、- ,计算两个数的和
if(a == 0){
return b;
}
if(b == 0){
return a;
}
while(b != 0){
int temp = a & b;
a = a ^ b;
b = temp << 1;
}
return a;
}
1.首先计算需要进位的全部位(a&b),假设a =1 = 0001,b = 3 = 0011,那么a&b = 0001,也就是说第一位需要进位,这时候<<1,左移1位,下一个循环参加运算的a就成了0010,a = 0010
2.b = a ^ b,将a中无关进位的位正常加起来,b = 0001 ^ 0011 = 0010
3.a换成之前保存的需要进位的temp,a == temp == 0010 != 0,那就说明还有需要前进的位。
a == 0010 != 0,下一次循环:
temp = (a&b)<<1 = 0100
b = 0000
a = 0100
a == 0100 != 0,继续循环:
temp = 0000
b = 0100
a = 0000
结束循环