美文网首页工作生活
LintCode A+B Problem Python

LintCode A+B Problem Python

作者: 流浪山人 | 来源:发表于2019-06-30 22:47 被阅读0次

    Description:
    Write a function that add two numbers A and B.
    Clarification
    Are a and b both 32-bit integers?
    Yes.
    Can I use bit operation?
    Sure you can.

    解析
    这个题目主要考察了基本功,包括二进制,位运算,迭代
    解题思路
    这道题考察的应该就是底层二进制是如何实现数字的加减的。
    首先考虑把十进制数转化成二进制树。举例说明,譬如3+6;
    3-> 0000 0011
    6-> 0000 0110
    按位操作运算中,没有涉及进位的直接运算符。因此考虑结合
    a^b(不进位加法)
    (a&b)<<1(用于表示进位的位置)
    我们考虑我们在做加法的时候,是不是先把两个数按照不进位的加法进行运算(a^b),然后再在进位的位置加1((a&b)<<1).
    所以我理解,a&b)<<1这一步就像扫描一样, 从最低位向最高位进行扫描,直到没有进位为止((a&b)<<1的结果为0)
    具体我们看这个实例:

    1. (a)3-> 0000 0011
      (b)6-> 0000 0110
    2. a^b= 0000 0101
      (a&b<<1)0000 0100 (恰好是第二位由于1^1造成的进位,导致第三位要加1,那么由于这个+1会不会造成第四位的进位呢?所以还需要递归下去)
    3. a^b= 0000 0001
      (a&b<<1)0000 1000
    4. a^b= 0000 1001
      (a&b<<1)0000 0000
      至此,递归结束了,因为第二项为0了,所以最终结果就是 0000 1001 转化为十进制为9

    为小白科普下位运算:

    操作 运算符符号 中文名称 描述
    ~x 或 not x ~ 或 not 按位求反 对x的各二进制取反,即把1变成0,把0变成1。等效于 -(x+1)
    x << y << 左移 将x的各二进位全部向左移动y位,相当于在x的二进制位后面加y个0 。 等效于 x * 2**y
    x >> y >> 右移 将x的各二进位全部向右移动y位,相当于将x的二进制位前y位切除 。等效于x / 2**y (取整)
    x & y 或 x and y & 或 and 按位与 只有x和y对应二进制位都为1,该位结果为1否者为0。对于二进制位长度不一样, 在前面添0补齐。
    x ^ y ^ 按位异或 x和y对应二进制位相异,该位置结果为1 否者为0, 对于二进制位长度不一样 ,在前面添0补齐。
    x | y 或 x or y 或 or 按位或 只要x和y对应二进制位有一个为1,该位结果为1否者为0 ,对于二进制位长度不一样, 在前面添0补齐。

    最终Python3 代码如下:实测负数会有问题,后续改进

    def aplusb(a,b):
        if a==0:
            return b
        elif b==0:
            return a
        else:
            s=a^b
            t=(a&b)<<1
            return aplusb(s,t)
    a=int(input("first number:"))
    b=int(input("second number:"))
    print(aplusb(a,b))
    
    

    相关文章

      网友评论

        本文标题:LintCode A+B Problem Python

        本文链接:https://www.haomeiwen.com/subject/mwemcctx.html