位运算的思路:
首先用异或得到每一位不考虑进位的和,作为新的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