371. Sum of Two Integers

题意是不用+号求两个数的和
想了两天没想出来,看了博客和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左移第一次
a01110111
b10011001
结果111000010010
竖式7^9第二次7&9第二次9左移第二次
a11101110
b00100010
结果110000100100
竖式7^9第三次7&9第三次9左移第三次
a11001100
b01000100
结果100001001000
竖式7^9第四次7&9第四次9左移第四次
a10001000
b10001000
结果0000100010000
竖式7^9第五次7&9第五次9左移第五次
a00000000
b1000010000
结果100000000000000

结果就是10000=16
随便举的例子哈哈
好了 看看这神奇的代码吧

int getSum(int a, int b) {
    int sum=0;
    if(b)
        return getSum(a^b,(a&b)<<1);
    else
        return a;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值