zoukankan      html  css  js  c++  java
  • 算法之道不用加,减, 乘 ,除 计算 a+b的值

     在面试笔试中会考到这类题目,要求不用加减乘除运算来计算两数和,其实考的就是位运算。

           规则1:

           如果1010+0101 = 1111在计算上不产生进位, 则1010^0101 = 1010+0101 = 1111   

         

          上面1010和 0101 二进制加法计算的特点是没有进位,所以他们的二进制加法和按位异或运算结果才会相同。但是如果如果是二进制加法运算有进位,则明显以上等价关系就不能成立。

           思路:如 20(10100)+25(11001)  =45二进制加法运算会产生进位,那我们把他转换成a和b两个数 满足a+b = 20+25 = 45且a和b二进制加法不会产生进位,按照规则1有 20+25  = a + b = a ^ b,明显我们可以找到一个例子 a=32(100000) b=13(001101)满足上述要求。

           如何找到a 和 b:

    当产生进位的时候,我们可以试着把产生进制的位置找出来, 20(10100)+25(11001) 进行按位与运算

    10100&11001 = 10000  可知道在最高位是两个1相与,故在最高位产生进位,10100^11001 = 01101这个结果是不进位的结果,只要我们把不进位的异或运算加上进位时候带来的结果增量加起来,就是我们最终想要的结果10100+11001 = 101101 .

    结果为:10100^11001+(10100&11001)<<1 =  01101+10000 <<1

    a  =  01101

    b =  10000 <<1 = 100000--->左移位后的结果即为进位产生的增量

    如果a   b还不满足上面思路中的要求的话,在继续重复上面的过程,知道找出满足思路中的啊a,b的值。

    代码如下:

     1  #include "stdio.h"
     2 int bitAdd(int a ,int b){
     3     printf("第一次递归 bitAdd(%d ,%d )\n",a,b );
     4     int jin = a&b;//进位
     5     int notJin = a^b;
     6     if (jin!=0)
     7     {
     8         return bitAdd(jin<<1,notJin);
     9     }else{
    10         return notJin;
    11     }
    12     return 0;
    13 }
    14  int main()
    15 {
    16     int a ,b;
    17     printf("输入两个数做加法(空格隔开)\n");
    18     scanf("%d %d",&a,&b);
    19     printf("结果:%d+%d=%d",a,b,bitAdd(a,b));
    20     return 0;
    21 }

     结果:

     

           

  • 相关阅读:
    CCleaner软件免费试用版与付费专业版区别
    TeamViewer 15.6.7新版本发布
    ABAPGIT用法
    ABAPGIT安装,配置及更新
    ABAPGIT安装,配置及更新
    SAP发布的WebService的登陆语言设置
    使用CG3Z向服务器添加文件时,报错:No physical path is configured for logical file name EHS_FTAPPL_2
    PO/PI 系统蓝图(SLD),企业服务存储库(ESR),整合目录(ID)基础配置
    S4 到 PO/PI proxy 配置手册
    在PI SLD中注册ABAP Technical System
  • 原文地址:https://www.cnblogs.com/chenchuangfeng/p/2987341.html
Copyright © 2011-2022 走看看