65 不用加减乘除做加法

题目

写一个函数,求两个正数之和,要求在函数体内不能使用四则运算符号。

牛客网 OJ

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)
posted @ 2019-03-17 21:59  youngliu91  阅读(197)  评论(0编辑  收藏  举报