描述:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
思路:不能用四则运算符,考虑使用位运算。加法需要处理的最重要的步骤就是进位。
在位运算中,异或(^)结果为1是表示两位不同,则是表示这两个数在这一位上一个是0一个是1,在进行“相加”时,不用进位。与(&)运算结果为1是表示两位都为1,则是表示这两个数在这同一位上都是1,需要进位,进位就是左移一位。经过这样一轮^和&运算后,得到了第一次的进位结果和非进位结果。此后进行循环重复,直到所有位都进完。举个栗子:
a=11(1011),b=13(1101)
第一轮:
a = 1011 (a & b)<< 1 = 10010 (进位结果)
b = 1101 a ^ b = 0110 (非进位结果)
第二轮:
a = 10010 (a & b) << 1 = 00100 (进位结果)
b = 00110 a ^ b = 10100 (非进位结果)
第三轮
a = 00100 (a & b) << 1 = 01000 (进位结果)
b = 10100 a ^ b = 10000 (非进位结果)
第四轮
a = 01000 (a & b) << 1 = 00000 (非进位结果) 至此,所有的位都进完了
b = 10000 a ^ b = 11000 (进位结果)
function Add(num1, num2) //递归法
{
if(num1 == 0) return num2
var temp = (num1 & num2) << 1
num2 = num1 ^ num2
return Add(temp, num2)
}
function Add(num1, num2) //非递归法
{
while(num1 != 0){
var temp = (num1 & num2) << 1
num2 = num1 ^ num2
num1 = temp
}
return num2
}