版权声明:本文为博主原创文章,欢迎转载,转载请声明出处! https://blog.csdn.net/hansionz/article/details/82701585
一.不用加减乘除实现加法
题目:实现一个函数,求两个数的和,但是要求在函数内不得使用+ - * /
四个运算符。
解题思路:不得使用四则运算符,我们只能考虑用位运算符
。
首先,我们先分析一般的加法是怎样去处理的:(假设求17+5)
- 1.先求各个位上的加法值(先不算进位),
1+0=1,7+5=2,既12
- 2.找出进位的数
7+5=12
存在进位,进位是10 - 3.将前两步的值相加
12+10=22
,刚好17+5=22
对于上述几个步骤中只有加法,如果我们不能使用四则运算符,我们可以考虑用位运算符去实现上述是三个步骤:
- 1.怎么用位运算符实现各个位分别相加,而不用加法呢?
17(10001)、5(00101)
,我们可以发现要对各个位进行相加,其实就是17^5=(10100)
(1^0=1,1^1=0,0^0=0,正好不算进位) - 2.找出进位的数字。
17(10001)、5(00101)
,我们要找到进位的数字,可以发现只有1+1的时候才会产生进位
,我们可以模拟成是两个数先安位与
,在向左移动1
位 - 3.第三步,将前两步相加。相加依旧是
重复前两步
,直到其中的一个数为0,也就是不在产生进位了,那么他们两个的和值就等于另外一个数字`
代码实现:
//不用加减乘除实现加法(用位运算)
int Add(int num1, int num2)
{
int sum, forward;
do
{
//1.各位相加,不产生进位(3(011)+2(010)-->1(001))
sum = num1^num2;
//2.找到要加的进位数(3(011)&2(010)-->1(010)<<1-->4(100))
forward = (num1&num2) << 1;
//3.将前两步的值相加,但是相加不能用加法,重复前面两个步骤,直到不产生进位
//第二步的forward值为0,它们的和必然是sum的值
num1 = sum;
num2 = forward;
} while (num2 != 0);//结束条件是不产生进位
return num1;
}