【JZ65 不用加减乘除做加法】题解

题目

写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

数据范围:两个数都满足 −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位,完成进位 计算

先看一下加法计算

接下来看代码中的计算

猜你喜欢

转载自blog.csdn.net/qq_72505850/article/details/132493685
今日推荐