- 本人的LeetCode账号:魔术师的徒弟,欢迎关注获取每日一题题解,快来一起刷题呀~
- 本人Gitee账号:路由器,欢迎关注获取博客内容源码。
一、思想
实现加法,只需要考虑两部分:
- 两数字相加后,当前二进制位的数值(1 + 1 = 0 1 + 0 = 1,不考虑进位)
- 求数字相加后进位的值
然后再把这两部分值加起来。
如1 + 3:00000001 00000011
不考虑进位的加法值:00000010
;
数字相加后的进位值:00000010
;
然后这两部分再加,不考虑进位的加法值:00000000
;
数字相加后的进位值:00000100
;
直到进位为0,则表示得到了结果。
获得不进位的相加后二进制位的取值呢,使用异或^
即可得到,两者相同是0,不同则为1,这也是异或被称为不进位加法的原因;
那么怎么获得二进制位的进位值呢,两数取&
,然后<<
1位即可,相与都是1才得1,有一个0就是0。
二、剑指offer65.不用加减乘除做加法

注意C++不支持负数的位移运算,但是我们的原理是对负数也好用的,加一个强转就行。
class Solution {
public:
int add(int a, int b)
{
if (b == 0) return a;
return add(a ^ b, (unsigned int)(a & b) << 1);
}
};