剑指offer JZ47 不用加减乘除做加法
题目描述:
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
解体思路:
整数在计算机中用二进制补码表示,加法的本质是每一个二进制数位做加法,并且对每一个二进制数位向上一位做进位。也就是说,对于两个二进制数相加,等于“忽略进位的加法结果”加上“进位结果”。而“异或”操作等效于忽略进位的加法;“与”操作等效于求进位,配合左移操作形成进位。
举个例子:
假设我们要求10+7
10+7 = 1010+0111
1010^0111 = 1101 //这是每一位忽略进位的加法
1010&0111 = 0010 //这是进位情况,左移一位得到新的加数 0100
此时,10+7 = 1010+0111 = 1101+0100
1101^0100 = 1001
1101&0100 = 0100 左移一位得到1000
此时, 10+7 = 1010+0111 = 1101+0100 = 1001 + 1000
1001^1000 = 0001
1001&1000 = 1000 左移一位得到10000
此时,10+7 = 1010+0111 = 1101+