剑指offer25 --- 不用加减乘除做加法

剑指offer25 — 不用加减乘除做加法

题目

写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

分析

  • 基础知识

    • 异或运算(^
      • 如果对应位值不同(1,0或者 0,1),做^操作的运算结果为1,否则为0,也就相当于在不考虑进位的情况下做加法。
    • 与运算(&)
      • 只有两个都是1的时候才是1,而在二进制中需要进位也是只有两个都为1的情况,那么可以通过做&运算来找到需要进位的位置,并且左移来得到进位后的结果。
    • 按位取反 ~
      • ~x = -(x+1)
  • 思路:

    • 重复^运算和&操作(记得左移),直到 &运算的结果为0,此时^的结果即为加法的结果。
  • 注意:
    python中是变长度的,需要限制为32位,即与0xFFFFFFFF^操作。此外,需要考虑^结果为负数的情况,为负数时,则需返回~(xorNum ^ 0xFFFFFFFF)

# -*- coding:utf-8 -*-
class Solution:
    def Add(self, num1, num2):
        # write code here
        xorNum = num1 ^ num2
        andNum = (num1 & num2) << 1
        
        while andNum != 0:
            tmp1 = xorNum ^ andNum
            tmp2 = (xorNum & andNum) << 1
            tmp1 = tmp1 & 0xFFFFFFFF
            xorNum = tmp1
            andNum = tmp2
        return xorNum if xorNum <= 0x7FFFFFFF else ~(xorNum ^ 0xFFFFFFFF)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FLOWVERSE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值