有这么一道题,要求不用 + - * / 运算符,来求两个数的加法
解题思路:我们先用两个10进制的数来相加,678+789,在不考虑进位的前提下,相加得357,只考虑进位的前提下,我们观察到,1110是这个数的每一个进位。第一个1是百位的进位,最后一个0是个位的进位,因为对个位没有进位,所以为0.将不考虑进位的数和只考虑进位的数相加得1467,刚好是两个数之和,所有我们得出一个结论:
两个数不考虑进位相加得到的值和只考虑进位的值相加就是两数之和
而在二进制下,我们举一个例子 01001和01101。如果不考虑进位的前提下,两数相加为00100.发现这与异或^
得到的值一致。而只考虑进位的话,值为 10010 ,而两个数相与&
得到的是01001,可以发现如果把相与的值左移<<
一位就得到只考虑进位的值。而根据上面的结论,我们把异或得到的值和相与左移一位得到的值相加得00100+10010 = 10110,即为两数之和
总结:当最高位不产生进位时,即只考虑进位的值为0,根据结论,两个数相加得结果 = 异或的结果+0,即此时两个数异或的结果即为两数之和。
代码:
int _Add(int a, int b)
{
while (b != 0)//当进位为0时,a即为两数之和
{
int tmp = a^b;//a与b异或相当于a与b相加,不考虑进位
int p = (a&b)<<1;//a和b相与,再左移1,相当于只考虑进位
a = tmp;
b = p;
}
return a;
}
void main()
{
cout << _Add(15, 12) << endl;
}