65 不用加减乘除做加法
题目
写一个函数,求两个正数之和,要求在函数体内不能使用四则运算符号。
C++ 题解
两个数异或:相当于每一位相加,而不考虑进位;
两个数相与,并左移一位:相当于求得进位;
将上述两步的结果相加
1. 两数进行异或: 0011^0101=0110 这个数字其实是把原数中不需进位的二进制位进行了组合
2. 两数进行与: 0011&0101=0001 这个数字为1的位置表示需要进位,而进位动作是需要向前一位进位
3. 左移一位: 0001<<1=0010
此时我们就完成 0011 + 0101 = 0110 + 0010 的转换,如此转换下去,直到不产生进位为止。
class Solution {
public:
int Add(int num1, int num2)
{
int sum,carry;
do
{
sum = num1 ^ num2;
carry = (num1 & num2) << 1;
num1 = sum;
num2 = carry;
}while(num2);
return sum;
}
};
python 题解
# -*- coding:utf-8 -*-
class Solution:
def Add(self, num1, num2):
# write code here
while num2:
sum_ = (num1 ^ num2) & 0xffffffff # 将其限定在32位
carry = ((num1 & num2)<<1)& 0xffffffff # 将其限定在32位
num1 = sum_
num2 = carry
# 是正数
if num1<0x7fffffff:
return num1
# 是负数
else:
return ~(num1^0xffffffff)