最近在网上做题,要求不用四则运算(+、-、*、/)实现两个数相加。我们首先想到的就是用位运算来实现,觉得挺有意思,也是对计算机底层运算原理的一个理解,故对其做了一个记录和原理分析。
函数实现如下图所示:
int add(int num1, int num2)
{
int tmp1 = num1^num2;
int tmp2 = (num1&num2)<<1;
while(tmp2)
{
num1 = tmp1^tmp2;
num2 = (tmp1&tmp2)<<1;
tmp1= num1;
tmp2= num2;
}
return tmp1;
}
原理分析:
以63加1为例,如下程序打印了位运算的过程(tmp1 和 tmp2 的二进制值):
其实原理很简单:
tmp1用来存放两个数相加(不进位)的结果,tmp2用来存放两个数相加的进位。那么number1加number2即可等效为tmp1加tmp2,由于tmp2是通过或运算再移位得来的,最终一定为为零,那么tmp1就是我们求的两数相加结果。