python/c++实现不用操作符 “+” 的A+B

位运算的思路:
首先用异或得到每一位不考虑进位的和,作为新的A
再用与运算来处理进位情况,作为新的B

继续上述操作,直到A&B和A^B中没有进位,也就是A&B=0,
此时A^B就是我们需要的 和 了。

这个在C++和Java中的实现是不难的

//C++
int aplusb(int a, int b) 
{
        // write your code here
        int Xor,And;
        while(b) 
        {
            Xor=a^b;
            And=(a&b)<<1;
            a=Xor;
            b=And;
        }
        return a;
}

在python语言中,情况有一点不同,对于一台64位系统电脑而言
在python2中:

#int最大值是sys.maxint=(1<<63)-1= Ox ffff ffff ffff ffff
#可以发现超过maxint之后转变成了Long类型,多了L后缀
>>> import sys
>>> sys.maxint
9223372036854775807
>>> 1<<63
9223372036854775808L

在python3中:
没有Long类型,只有int类型,int类型大小不受限制(仅仅受限内存大小)
因此之前的sys.maxint也没有了。

# L后缀已经取消了
>>> 1<<63
9223372036854775808

回到原题

//c++
while(b){
    ...
    And=(a&b)<<1
    b=And
    ...}

这一句代码的思想在python中是不可能终止了,要添加int的临界条件。
具体来讲,就是让循环能够正常的舍弃溢出位
可以通过加一个&条件来实现过滤高位(因为a是不需要考虑进位的),从而把数字保留在int范围

def aplusb(a, b):
    while(b):
        a,b=(a^b)&0xffffffffffffffff, (a&b)<<1 
    return a    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值