ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

不用加减乘除做加法

2020-07-01 13:41:29  阅读:251  来源: 互联网

标签:10 num2 不用 按位 加法 101 进位 加减乘除


不用加减乘除做加法

题目描述:

在这里插入图片描述

解题思路:

针对十进制

  • (1)先理解一下10进制是如何做加法的。例如5+7=12,分为3步。
  • (2)先不考虑进位值,5+7得到2,再计算进位值,个位上5+7的进位为1,所以进位为1*10=10 (要乘以10是因为个位上进一相当于加10).
  • 重复(1),(2),直到没有进位制产生,就结束了。例如本题就是再次计算2+10,不考虑进位为12,计算进位得到0,所以最终结果为22
  • 对于10进制,还是用到了加法和乘法运算。

针对二进制

  • 对于2进制的计算也是一样的,由于二进制的特殊,还可以用位运算替代加法运算和乘法运算。
  • 按位异或:1^1=0 0^0=0 1^0=1 0^1=1,异或是相同为0,相异为1
  • 按位与 :1&1=1 0&0=0 1&0=0 0&1=0
  • 所以按位异或等价于不考虑进位的加法,按位与左移1位表示进位值。
  • 同样考虑5+7,注:5=101,7=111,
  • (1)先不考虑进位值,101^111=010
  • (2)计算进位值,101&111=101,需要再左移一位,得到1010
  • 重复(1),(2)
  • (1)先不考虑进位值,0010^1010=1000
  • (2)计算进位值,0010&1010=0010,再左移一位,得到00100
    重复(1),(2)
    先不考虑进位值,01000^00100=01100
    计算进位值,01000&00100=0,左移之后还是0
    因为进位值为0,所以计算可以终止,最终结果为01100,即12
    在这里插入图片描述

二进制运算符

在这里插入图片描述

代码如下:

class Solution {
public:
    int Add(int num1, int num2)
    {
        while(num2!=0)
        {
            int temp=num1^num2;
            num2=(num1&num2)<<1;
            num1=temp;
        }
        return num1;
    }
};

标签:10,num2,不用,按位,加法,101,进位,加减乘除
来源: https://blog.csdn.net/weixin_43831728/article/details/107043137

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有