zoukankan      html  css  js  c++  java
  • 不使用四则运算符计算两个整数的和

    这里笔者只写出关键代码:

     1 int add(int n,intm)
     2 {
     3 
     4    if(m==0) returnn;             ①
     5  
     6    int sum=n^m;                  ②
     7 
     8    int carry=(n&m)<<1;           ③
     9 
    10    return add(sum,carry);        ④
    11 
    12 }

    在分析每步代码之前先看两个例子:
    不带进位的两数相加:
    0000 0010------2
    0000 0100------4
    结果是:
    0000 0110------6
    带进位的两数相加:
    0000 0101------5
    0000 0100------4
    结果是:
    00001001------9
    先将这两个例子代入函数中,通过对比进位操作和不进位操作的不同,来了解此函数的执行过程。

    定义一个add函数,并声明所需的两个整型变量:
    ①当m,n中有一个为0,则结果返回的是另一个数值。此语句是程序的最终出口。

    ② n与m做异或运算,如果m与n相加没有进位,sum就是所求的结果。否则保存没有存在进位的数值,继续执行下面的进位操作。

    ③ m与n做相与运算,然后左移1位。产生进位时,m与n在某一个相同位置上同时为1,相与之后依然为1,左移1位,便可得到进位数值。二次以上的进位以此类推。如果没有进位,则carry为0。

    ④ 递归函数return add( ),将上述步骤得到的sum和carry进行再次类似的运算,直至没有产生进位为止,即carry=0。

    注:若分析有误望大家指出!

  • 相关阅读:
    HD1205吃糖果(鸽巢、抽屉原理)
    POJ3628 Bookshelf 2(01背包+dfs)
    poj1631Bridging signals(最长单调递增子序列 nlgn)
    【转】KMP算法
    Intern Day1
    记 MINIEYE C++应用开发实习生技术一面
    解决Mac下CLion无法编译运行多个cpp的问题
    记赛目科技C++开发工程师实习生技术面
    Git总结
    Docker学习大纲
  • 原文地址:https://www.cnblogs.com/gxchexi/p/3815944.html
Copyright © 2011-2022 走看看