在刚刚做这道题的时候,开始并没有头绪,在看到提示使用位运算符的时候,但是对这些符号的了解不太记得,所以在网上找了一些关于位运算符的资料,归纳如下:(供日后参考)
1.“&”,二进制中相对位数的两个数都为1,结果才为1,否则结果为0,类似逻辑门中的与门。
2.“|”,二进制中相对位数的两个数中有一个1或都为1,结果为1,否则结果为0,类似逻辑门中的或门。
3.“~”,(单目运算符)二进制中相对位数的数为1时,结果为0,为0时,结果为1,类似逻辑门中的非门。
4.“^”,二进制中相对位数的两个数不同时,结果为1,两个数相同时结果为0,类似逻辑门中的与非门。
5.“<<”, 用来将一个数的各二进制位全部左移N位,右补0,例如:11101<<2=1110100。
6.“>>”,将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0,例如:11101>>2=00111。
在思考的过程中发现,^运算和+法运算的不进位结果相同,&运算和加法运算的只进位结果类似。
第一步,相加,不进位时,如果两个位都是0或1,则相加为0,不相同时则为1,所以用异或表示
第二步,相加,只进位,也就是说只有当两个位都是1时才进位,其它情况不进位,所以用按位与,然后左移,因为最后一位进位为0
第三步,递归直到没有位可进。
int Add(int num1, int num2)
{
int sum=0;
int a=0;
do
{
sum=num1^num2; //不进位的结果
a=(num1&num2)<<1; //只进位的结果
num1=sum;
num2=a;
}while(num2!=0);
return num1;
}
同时还可以使用递归函数表示