Calculate the sum of two integers a and b, but you are not allowed to use the operator +
and -
.
需要用位运算,比如当11101和10111两个数相加时,
0 1 1 1 0 1
0 1 0 1 1 1
1 1 0 1 0 0
运算时可以发现,如果不考虑进位的问题,1和1,0和0相加时,该位结果是0,1和0相加时如果低位没有进位则该位结果是1,这是一个异或操作,因此可以先将两个数异或得到一个中间结果。接下来考虑进位的情况,只有1和1相加是会产生进位,与操作反映了这样一种情况,只有两个1与时结果为1,但是因为进位是要进到高位,也就是左边一位,所以需要将与的结果左移一位,再和之前的中间结果相加,就是上述操作的重复了。
int getSum(int a, int b) {
int sum=0;
int carry=0;
do{
sum=a^b;
carry=a&b;
carry<<=1;
a=sum;
b=carry;
}while(carry!=0);
return sum;
}
关于位操作我是看剑指offer时第一次接触到,第一次看完全没有思路,看了答案觉得真的很吊,所以又自己将解题思路顺一遍,希望能通过训练提升思维能力吧