《剑指offer》 第65题 不用加减乘除做加法
不用加减乘除做加法
http://www.nowcoder.com/questionTerminal/59ac416b4b944300b617d4f7f111b215
分步考虑:
- 首先只做加法,不考虑进位问题。1+0=1;0+1=1;0+0=0;1+1=0(不考虑进位),所以相当于做 异或 运算
- 接着只考虑进位。只有1+1会发生进位,所以相当于做按位与运算。与运算的结果中为1的位说明该位发生进位。
- 发生进位应该左移一位。若没发生进位,则相与的结果为0,左移一位还是0
- 将不考虑进位的结果和只考虑进位相加(其实就是将1.和2.和3.的结果相加),相加的时候还有可能再产生进位,因此二者相加的过程可以再次重复循环步骤1和2和3,直到(m&n)<<1变为了0,这时候不会再产生进位,退出循环即可。
以9 和 12 为例:
9的二进制 1001 12的二进制 1100
第一步: 1001^1100= 101
第二步: 1001&1100=1000
第三步:进位 1000 -> 10000
开始重复
第四步: 101^10000 = 10101
第五步: 101&10000 = 0
结束
结果为10101 = 21
function Add(num1, num2) { // write code here let xor = 0; while(num2 != 0){ xor = num1 ^ num2; num2 = (num1 & num2) << 1; num1 = xor; } return num1; }