码迷,mamicode.com
首页 > 其他好文 > 详细

不用加减乘除做加法

时间:2019-01-27 19:16:59      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:ret   实现   内容   int   span   上进   规律   out   pre   

题目

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

思路

  二进制中,两个数相加有如下的规律

  1. 如果对应的位上都为1,那么该位上就要归零,并且往左侧进一位;
  2. 如果对应的位数不全都是1(1/0, 0/1, 0/0三种情况),那么该位在相加时,如果是1/0,或者0/1,就可置为1,如果是0/0,那就置为0。

所以有如下解法:

  1. 先将各bit位相加,不计进位,用异或实现
  2. 加上进位,用与运算,全为1与之后为1,而不全为1的位则全部变为了0,该位相加会发生进位,使得左边一位加1,因此(m&n)<<1边可得到进位后要加的1的位置
  3. 将前面两步的结果相加,相加的时候还有可能再产生进位,因此二者相加的过程可以再次重复循环步骤1和2,直到(m&n)<<1变为了0,这时候不会再产生进位,退出循环。
#include <iostream>
using namespace std;

class Solution
{
    public:
        int add(int num1,int num2);
};
int Solution::add(int num1,int num2)
{
    int sum=0,carry=0;
    do
    {
        sum=num1^num2;
        carry=(num1&num2)<<1;
        num1=sum;
        num2=carry;
    }while(num2!=0); 
    return num1;
}

int main()
{
    Solution s;
    cout<<s.add(3,3)<<endl; 
    return 0;
}

 拓展

  不定义新的变量交换两变量的值。

  1.基于加法

void swqp(int a,int b)
{
    a=a+b;
    b=a-b;
    a=a-b;
}

  2.基于异或运算

void swap(int a,int b)
{
    a=a^b;
    b=a^b;
    a=a^b;
}

 用这个办法交换2个指针的内容.那么你要先检查2个指针指向的地址是否相同.不然会导致内容被清0

不用加减乘除做加法

标签:ret   实现   内容   int   span   上进   规律   out   pre   

原文地址:https://www.cnblogs.com/tianzeng/p/10326705.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!