题意是不用+号求两个数的和
想了两天没想出来,看了博客和discuss获取了新知识点:借用位运算(^)和与运算(&)
整数在内存中都是以二进制的形式存放的,所以进行位运算的时候,不用想着把1,2,3转化为001,010,011
输出时也不用想着把100,101,110转化为4,5,6
因为平时输出也是直接输出4,5,6这样的整数结果,而位运算、与运算就是针对内存中0,1,0,1这样的存放形式的进行的
好了下面是如何进行加法,0,1的加法运算里
0+0=0,0+1=1,1+0=1,1+1=10
如果不考虑进位,只考虑本位的话
0^0=0,0^1=1,1^0=1,1^1=0
和加法运算得到的本位结果一致
如果只考虑进位不考虑本位结果的话
0&0=0,0&1=0,1&0=0,1&1=1
和加法运算得到的进位结果一致
因为进位所以<<左移一位,再次与a^b的本位结果进行加法运算,得出的就是结果
所以sum=a^b+(a&b)<<1
因为不让用加号,
所以就反复迭代这个getSum函数,直到b=0,也就是没有进位了,那a就是最终的结果a+b的和
举个例子:
7+9=16
7是111
9是1001
竖式 | 7^9第一次 | 7&9第一次 | 9左移第一次 |
---|
a | 0111 | 0111 | |
b | 1001 | 1001 | |
结果 | 1110 | 0001 | 0010 |
竖式 | 7^9第二次 | 7&9第二次 | 9左移第二次 |
---|
a | 1110 | 1110 | |
b | 0010 | 0010 | |
结果 | 1100 | 0010 | 0100 |
竖式 | 7^9第三次 | 7&9第三次 | 9左移第三次 |
---|
a | 1100 | 1100 | |
b | 0100 | 0100 | |
结果 | 1000 | 0100 | 1000 |
竖式 | 7^9第四次 | 7&9第四次 | 9左移第四次 |
---|
a | 1000 | 1000 | |
b | 1000 | 1000 | |
结果 | 0000 | 1000 | 10000 |
竖式 | 7^9第五次 | 7&9第五次 | 9左移第五次 |
---|
a | 0000 | 0000 | |
b | 10000 | 10000 | |
结果 | 10000 | 00000 | 00000 |
结果就是10000=16
随便举的例子哈哈
好了 看看这神奇的代码吧
int getSum(int a, int b) {
int sum=0;
if(b)
return getSum(a^b,(a&b)<<1);
else
return a;
}