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;
}
public int Add(int num1,int num2) {
while (num2!=0) {
int temp = num1^num2;
num2 = (num1&num2)<<1;
num1 = temp;
}
return num1;
}
}
例如 5+7 = 12
5 -> 0101
7 -> 0111
(0101&0111)<<1 =1010;//表示二进制进位了
0111^0101 = 0010//或是查看两个数哪些二进制位只有一个为1
//step1:按位与是查看两个数哪些二进制位都为1,这些都是进位位,结果需左移一位,表示进位后的结果
//step2:异或是查看两个数哪些二进制位只有一个为1,这些是非进位位,可以直接加、减,结果表示非进位位进行加操作后的结果
//step3:num1&num2是查看有没有进位位了,如果有,需要重复step1、step2;如果没有,保留n1、n2上二进制为1的部分,用或将之合为一
第二次
1010 ^ 0010 = 1000
1010 &
0010 =00100
第三次
1000^ 0100= 1100
1000& 0100 =0000