标签:== 出现 pre 条件 技巧 turn public 相加 代码
a+b的值可以等价于a^b+(a&b)<<1,也就是a异或b的值加上a与b的值再左移一位。a异或b的值被叫做非进位求和,(a&b)<<1是求每位的进位。举个例子就明白为什么是这样了。
比如计算5+4,对于二进制而言,100+101=1001,产生了进位。那么,100^101=001,100&101=100,左移一位就是1000(你算出是100吗?这里要注意,左移必须在右边补0),所以,1000+001=1001,5+4正好是9.我是这么理解的。下面举个两位数的,原理是一样的。13+9,1101^1001=0100,1101&1001=1001,左移一位就是10010,10010+0100=10110,正好是22.
但是上面还是出现了进位和非进位的和,但是不能用加法直接相加。这里用到了一个小技巧,递归操作。递归的终止条件是进位为0,返回非进位和。举个最简单的例子就行了,比如 2+3 ,进位是不是0,整个和是不是非进位和?
简单的代码:
‘‘‘
class Solution {
public:
int add(int a, int b) {
if(b==0)
return a;
int c=a^b;
unsigned int d =((unsigned int)(a&b)<<1);
return add(c, d);
}
};
标签:== 出现 pre 条件 技巧 turn public 相加 代码
原文地址:https://www.cnblogs.com/xyuanzi/p/13362092.html