题目:用位运算模拟加法
主要考虑到有(a + b) == (a^b) + (a & b) << 1 的关系,一直重复下去直到(a & b) << 1等于0即可
用C++语言的话,代码如下
#include <iostream>
using std::cout;
using std::endl;
int add(int a, int b) {
    return b ? add(a ^ b, (a & b) << 1) : a;
}

int sub(int a, int b) {
    return add(a, add(~b, 1));
}
int main() {
    cout << sub(79, 78) << endl;
    return 0;
 }
该代码在C++下能正确运行。
但在python下
def add(a,b):
    print("a:{} b:{}".format(a,b))
    return a if b == 0 else add(a ^ b, (a&b)<<1)

def sub(a,b):
    return add(a,add(~b,1))

print(sub(79,78))
会报错
RecursionError: maximum recursion depth exceeded while calling a Python object
主要原因可以看print最后打印的ab值
a:-334846439745708537796382827831250565800439003657979252326171996365734703476542538279124493379904955664873335286735358382870982901778848138624518049209330462622955242963257218294408581408199098183686068192282702343236935664606211486223923248314908216080349889927704442739388432239144512088662677127167 b:334846439745708537796382827831250565800439003657979252326171996365734703476542538279124493379904955664873335286735358382870982901778848138624518049209330462622955242963257218294408581408199098183686068192282702343236935664606211486223923248314908216080349889927704442739388432239144512088662677127168

a:-669692879491417075592765655662501131600878007315958504652343992731469406953085076558248986759809911329746670573470716765741965803557696277249036098418660925245910485926514436588817162816398196367372136384565404686473871329212422972447846496629816432160699779855408885478776864478289024177325354254335 b:669692879491417075592765655662501131600878007315958504652343992731469406953085076558248986759809911329746670573470716765741965803557696277249036098418660925245910485926514436588817162816398196367372136384565404686473871329212422972447846496629816432160699779855408885478776864478289024177325354254336
这个主要原因是因为python里面int并非是按32位进行存储,会自动进行扩充,以容纳大数运算,因此用位运算来模拟加法会因为无法利用溢出截断导致无法成功。
因此上述代码需要如下修改
def add(a,b):
    print("a:{} b:{}".format(a,b))
    return a & 0xFFFFFFFF if b == 0 else add((a ^ b) & 0xFFFFFFFF, ((a&b)<<1)  & 0xFFFFFFFF)

def sub(a,b):
    return add(a,add(~b,1))

print(sub(79,78))

 

最后修改日期: 2024年10月24日

作者