这确实是一道简单的加法题,但是却实际上考察了 面试者的深度,一道加法题能玩出怎么的花样呢?
那就是 位运算
位运算有哪些呢?
与 & 就是一般的与 0101&0001 = 0001
异或 ^ 同0异1 0101^0001 = 0100
非 ~ 取反 ~0001 = 1110
<< >> 分别是左右移位 0010 << 1 = 0100 左移一位
那么如何用位运算计算加法呢?
也即是说 二进制的加法是怎么样的呢?
二进制的就算可以说是一直重复的两个步骤:
与运算,carry = a&b << 1, 这一步算出来的 进位,(因为只有两个数的某一个位置都是1的时候才会进位,所以用与运算,)(因为是进位,所以要左移一位)
异或运算,只有 a ^= b, 这一步是计算不考虑进位的情况下,a 和 b的值,应该是多少,(只有当10或01的情况下,本位才有可能是0)
之后判断carry是否为空,如果carry不为空,则用现在的结果 再去加 carry,重复1,2,3,直到carry为空
public class Solution {
public int getSum(int a, int b) {
while (b != 0) {
int c = a & b; //carry
a ^= b; //add
b = c << 1;
}
return a;
}
}