题目
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
数据范围:两个数都满足 −10≤n≤1000
进阶:空间复杂度 O(1),时间复杂度 O(1)难度:简单
题目链接:不用加减乘除做加法
示例
输入 1,2
返回值 3
代码
int Add(int num1, int num2 ) {
// write code here
while(num2 != 0)//当不在进位时
{
int tmp = num1^num2;//通过每一次异或得到数值位
num2 = (num1&num2)<<1;//进位 位
num1 = tmp;//更新数值位
}
return num1;//返回两数之和
}
题解
根据题目,不能使用 + - * / 来进行来两个数的加法,这时我们可能就会想到 &,|,^ 这些位操作符
接下来介绍的解法就是 使用 ^ 和 & 来进行两数加法。(如果对计算机组成原理很熟悉的话,可会想到 cpu 中的 ALU 加法器)
平时 我们计算两数之和 比如 1+ 2 = 3,对应的二进制位为int 四个字节32位这里先展示后四位
0001 + 0010 = 0011(这里会看到只是数值相加,就得到我们想要的结果了,但是再深度了解一下,cpu里面的加法器(里面既有数值上的计算,又有进位上的计算))
所以我们 在这里 也 实现 既有数值的计算也有进位的计算
先让num1 为数值位,num2为进位位,while(进位位),当不在进位时,即计算完(num2 为0)
在循环中,我们先 用 num1 与 num2 进行 异或运算 (相同为 0 ,不同为1)得到当前数值位
再 num1与num2 进行 按位与,再左移1位,完成进位 计算
先看一下加法计算
接下来看代码中的计算