题目:写一个函数,求两个整数之和,要求在函数体内不得使用“+” “-” “*” “/” 四则运算符号。
思考:求两个数之和,四则运算不能用,能用什么?
1.分析人们是如何做十进制加法的(用6+17举例)
①各位相加不进位,得到结果是 13
个位6+7=13 不要进位是 3,十位0+1=1
②做进位
6+7=13,有进位,进位的数是10
③把前面两个结果相加
13+10=20
图示:
2.对数字做运算,除四则运算外,还有一个容易被忽视的,就是位运算
3.十进制数相加的方法是否同样适用于二进制数(用6+17举例)
6 二进制:0110 17二进制:10001
①各位相加不进位,得到结果是:10111
②做进位
这个例子中没有进位,所以是0
③把前面两个结果相加
10111+0=10111
图示: 6+17 5+17
由此可见,上面的方法对二进制同样适用。
思考:怎样用程序表现出来?
观察:(用到位运算)
①不考虑进位对每一位进行相加,0+0,1+1结果都是0,0+1,1+0结果都是1,联系到位运算,很容易想到异或运算
②对于1+0,0+1,0+0都不会产生进位,只有1+1会向前产生一个进位,联系到位运算,想到与运算,再左移一位
③把前两个结果相加。(重复前面两步,直到不产生进位)
程序:
#include<stdio.h>
int add(int a, int b)
{
int sum, carry;
do
{
sum = a ^ b;
carry = (a&b) << 1;
a = sum;
b = carry;
} while (b != 0);
return a;
}
int main()
{
int a=6, b=17;
printf("%d\n", add(a, b));
int c = -5, d = 17;
printf("%d\n", add(c, d));
int e = 0, f = 19;
printf("%d\n", add(e, f));
return 0;
}