不用加减乘除做加法

题目描述

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

示例1

输入

1,2

返回值

3

做题思路:

一开始拿到这道题目最先想起的就是ASCII码,记得以前做题的时候好像各种ASCII码一减去就得到值,不过仔细一想不是这样的,这题考察的肯定不是这个知识,而是我原来不经常用的位运算(小丑竟是我自己!)正好回顾一下这个知识点。

从十进制的加法转到二进制的加法来做,这样就可以用与运算,或运算,异或运算来表示二进制的加法了,具体的位运算如图所示:

首先看十进制是如何做的: 5+7=12,三步走
第一步:相加各位的值,不算进位,得到2。
第二步:计算进位值,得到10. 如果这一步的进位值为0,那么第一步得到的值就是最终结果。

第三步:重复上述两步,只是相加的值变成上述两步的得到的结果2和10,得到12。

同样我们可以用三步走的方式计算二进制值相加: 5-101,7-111 第一步:相加各位的值,不算进位,得到010,二进制每位相加就相当于各位做异或操作(相同的为0,不同的为1,就是如果末位都是0,那么结果末位也是0,末位都是1结果末位也是0),101^111。

第二步:计算进位值,得到1010,相当于各位做与操作(只有都是1才得到1,这样就相当于是末位有进位,但是这样进位是需要左移一个位置的,这个很好理解。)得到101,再向左移一位得到1010,(101&111)<<1。

第三步重复上述两步, 各位相加 010^1010=1000,进位值为100=(010&1010)<<1。
     继续重复上述两步:1000^100 = 1100,进位值为0,跳出循环,1100为最终结果。
class Solution {
public:
    int Add(int num1, int num2) {
            int temp1 = num1^num2;//不进位,异或运算
            int temp2 = (num1&num2)<<1;//进位,与运算,左移一个单位
            return temp1+temp2;
    }
};

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页