前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Leetcode 371. 两整数之和

Leetcode 371. 两整数之和

作者头像
zhipingChen
发布2019-10-14 15:01:41
4020
发布2019-10-14 15:01:41
举报
文章被收录于专栏:编程理解编程理解

题目描述

不使用运算符 + 和 - ​​​​​​​,计算两整数 ​​​​​​​a 、b ​​​​​​​之和。

示例 1:

输入: a = 1, b = 2

输出: 3

示例 2:

输入: a = -2, b = 3

输出: 1

解法

之前在Leetcode 137. 只出现一次的数字 II中提到过二进制的异或运算相当于不进位加法,二进制的与运算相当于捕获进位点。则两整数相加,等同于两整数异或运算的值,加上与运算左移一位的值,迭代执行,直到进位点为零。所以该题目可以通过异或运算和与运算替代加法的执行。

因为在python中整数不会溢出,所以要模拟32位二进制的位运算,需要每次运算后对mask=0x100000000执行取余运算,来获取后32位二进制。 并且需要注意,32位二进制能够表示的最大数是max_int=0x7fffffff,即首位符号位为0。所以最后python表示的返回值,若大于max_int,则需要将该python返回值处理成与后32位二进制表示值相等的结果。 因为此时python值大于max_int值,所以从右向左的第32位二进制位1,也就是32位二进制下的负数,此时需要做的处理操作,就是把第32位和左边的所有位(不确定python是多少位)都处理成1,也就是把32位二进制的下的负数,变成python下的负数。 参考LeetCode上的一种处理方式,对0~31位进行取反,然后对所有位进行取反,以此完成32位及之后的所有位置1的操作。

代码语言:javascript
复制
class Solution:
    def getSum(self, a: int, b: int) -> int:
        mask=0x100000000
        max_int=0x7fffffff
        min_int=0x80000000
        while b:
            a,b=(a^b)%mask,((a&b)<<1)%mask
        return a if a<=max_int else ~((a%min_int)^max_int)

参考

位运算详解以及在 Python 中需要的特殊处理

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.10.13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档