#include <stdio.h>
#include <assert.h>
#define __DEBUG__ 1
int MyAdd(int a, int b)
{
/* 定理1:
* if (0 == (a & b)) {
* a + b == a ^ b;
* }
* 换句话说就是,如果两数相加时没有进位,则加法运算可由异或运算代替。
* 两数相与生存下来的位就是相加会向左产生进位的位,所以
* (a & b)就可以判断两数相加会不会产生进位,而且(a & b) << 1
* 就是所有--进位位--的进位值之和。
* */
/* 定理2:a + b = a ^ b + ((a & b) << 1)
* 就是把加法拆成--每位相加的和--与--进位值--两部分相加
* 等式右边也是加法,又可以拆,这就形成了一个递归的过程
* 要使递归终止,需使用定理1,也就是不再有进位,定理2等式右边
* 的加号就可以换成异或符号。
* */
/* 这里的a, b可视为某两个数A和B的--每位相加的和--和--进位值 */
int cf = a & b;
int sum = a ^ b;
while (cf) {
a = sum;
b = cf << 1;
cf = a & b;
sum = a ^ b;
}
#if __DEBUG__
assert(sum == a + b);
#endif
return sum;
}
位运算实现加法
最新推荐文章于 2021-12-16 12:53:54 发布