(lintcode): A + B 问题 python解法

1. A + B 问题

描述:给出两个整数 a 和 b , 求他们的和。

解法一:直接return a+b

class Solution:
    def aplusb(self, a, b):
        return a + b

解法二: 位运算

class Solution:

    def aplusb(self, a, b):

        if a == 0:  #不再进位
            return b
        if b == 0:  #直到没有需要进位的时候返回
            return a
        if a == -b:
            return 0
        m = a^b   #异或运算得到不需进位的数
        n = (a&b) << 1   #先与运算,再左移一位得到需要进位的数
        return self.aplusb(m,n)  
        #递归方法,将需要进位的数与不需进位的数相加,不断重复上述步骤,直至不再产生进位

先介绍一下位运算运算符:与(&):0&0=0,0&1=0,1&0=0,1&1=1;

                                            或(|) :0&0=0,0&1=1,1&0=1,1&1=1;

                                            非(~):~0=1,~1=0;

                                            异或(^):0&0=0,0&1=1,1&0=1,1&1=0;

左位移:左位移一位(a<<1)若a = 2,0010 左移一位得0100, 即a<<1为4

              左位移一位相当于乘以2的一次方,左移n位,相当于乘以2的n次方

同理:右位移n(a>>n)位相当于除以2的n次方,这里取商

2+3 = 5  相当于二进制010(2) + 011(3) 应得 101(5)

计算步骤:

              010+011:010 ^ 011 = 001 ;010 & 011 = 010 ;001<<1=100;

              001+100:001 ^ 100 = 101 ;001 & 100 = 000;000<<1=000;

              101+000:b=0,return a    101即结果5

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值