位运算
C++:
class Solution {
public:
int Add(int num1, int num2)
{//位运算,以5+7 =12为例,0101+0111 -》不考虑进位的和 + 只考虑进位的和,进行递归,
/*
int sum1 = (num1 ^ num2);//计算num1与num2的二进制不考虑进位的和
int sum2 = (num1 & num2) << 1;//计算num1与num2的二进制只考虑进位的和
while(sum2 != 0){
//递归
Add(sum1, sum2);
}
//当sum2==0,此时sum1的值就是两个整数的和
return sum1;
*/
return num2 !=0 ? Add(num1 ^ num2, (num1 & num2) << 1) : num1;
}
};
python:
# -*- coding:utf-8 -*-
class Solution:
def Add(self, a, b):
#return self.Add(a ^ b, (a & b) << 1) if b else a
#这样递归超过了默认的递归深度,python的递归深度有限
while b:
a, b = a ^ b, (a & b) << 1
a &= 0xFFFFFFFF # 获取a的32位整型表示
b &= 0xFFFFFFFF
if a > 0x7FFFFFFF: # 考虑负数的情况,32位能表示的最大的正数为0x7FFFFFF,如果a &= 0xFFFFFFFF的结果大于0x7FFFFFFF,就说明a是个负数
#则a &= 0xFFFFFFFF得到的是a的无符号补码。需要进行转原码的处理
a = ~(a ^ 0xFFFFFFFF) #根据无符号的负数补码得其有符号的原码
return a
关于位运算的一篇详细博客总结:https://blog.csdn.net/qq_16137569/article/details/82790378