【1337code ez series】不用加号实现加法

Posted on 2018-01-29 21:43  Unkn0wnnnnn  阅读(99)  评论(0)    收藏  举报

第一眼看到这道题的时候其实头皮有点发麻,根本没有多想到二进制这一个方面来,平时也对二进制下的操作使用较少,自然没有能够及时想起,反而是在想能不能强制性的将两个数转换为两个内存上不同的地址再针对地址,使用指针的偏移进行操作,最后返回地址。这里针对这一种方式不做过多的讨论,而是回到问题的本质,加法在二进制上的体现来。

二进制中当我们在处理加法时,如果没有出现进位,那么这样的一个加法操作就非常的好办,直接将a与b两个数按位相或即可,然而在多数的场进下,二进制相加总是会产生进位的。所以应该重新分析。

a+b在二进制上的体现其实很简单,从最低位开始相加,不考虑上一位产生的进位的情况下,如果一位为0,一位为1,则答案的对应位置为1,如果两位都为1,则答案对应位置为0,如果两位都为0,则答案对应位置为0,那么可以想到的是,在不考虑上一位的进位的情况下,两数相加所对应位置的结果,为a^b,即异或。

那么对应a+b,只考虑进位的情况呢?如果只考虑所造成的进位,就很简单了,只有在相同位置都为1才能产生进位,为a&b,即位与操作,而产生进位后的1并不会在相对应位置出现,而是会左移一位。那么具体的实现源码如下:

int Addwithoutsymbol(int a, int b){
        if(a==0)
        return b;
    int temp1=a^b;
    int temp2=a&b;
    return Addwithoutsymbol(temp1,temp2<<1);
};