又来一题咯:求两个整数的之和,要求在函数体内不得使用+、-、×、÷、++、- -

    呵呵!此题看到后开始感觉很无语,其实大家看到后我感觉都是会有一个想法:那就是,此题不要用四则运算,那么就是位运算,对!这是大家的思维不错,但是具体怎么做呢?呵呵~~~O(∩_∩)O~

 

    首先,我们必须要转化为二进制分析是吧,这个是必须的哦!例如:(5 + 17)D == ( 101 +10001)B结果应该是10110吧!那么我们分析:对于二进制的加法而言,1 + 1 = 0, 1 + 0 = 1, 0 + 0 =0,那么这个与位运算里面的“异或”是一样的是吧!呵呵,那么 if 我们先不考虑进位的话( 也就是有点像汇编里面的ADDAX,BX;有没有进位我先不考虑,在ADC中再说吧,呵呵~ ) 那么、我们的第一个数值就出来咯就是:tempNum1 = num1 ^ num2; 那么进位怎么办呀?我们再看,if我们还是用二进制加法的话,那么0 + 0 的进位是0,1 + 0 的进位是0,只有1 + 1的进位是有效的是吧!再联系一下位运算的&运算,只有1&1 = 1(也就是相当于是有效的运算,O(∩_∩)O~ ),所以我们可以先 num1& num2 ,但是你要注意那么我们的carry(也就是进位怎么加上去呢 ),我们知道进位是进到高一位的,那么不就是"<<" 的左移运算么?!同时我们也知道,if num1和 num2 相互 &之后是0,那么就是不存在进位了,那么就是相当于运算完成,所以综上所述,我们可以用递归的思想来做此题,所以思路就很清晰了不是么~?!呵呵,参考代码如下:

  

   int calculate( int num1, intnum2   //! 当然初始化进入的时候是两个intbianl

                                      //! 后面递归进入的其实就是位运算的carry了( 进位情况 )

      if( 0 == num2 )

      {

          return num1;

       }

      int sumTemp = num1 ^num2;       //! 先做不进位的处理

      int carry   = ( num1& num2 )<< 1; //! 进位处理

      return calculate( sumTemp,carry );

   }

 

  呵呵,好玩好玩,其实大家也可以用汇编处理的,但是小弟能力不够,就不写了啊 O(∩_∩)O~


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值