371.两整数之和

不使用运算符

class Solution:
    def getSum(self, a: int, b: int) -> int:
        MASK = 0x100000000
        # 整型最大值
        MAX_INT = 0x7FFFFFFF
        MIN_INT = 0x80000000
        while b != 0:
            # 计算进位
            carry = (a & b) << 1 
            # 取余范围限制在 [0, 2^32-1] 范围内
            a = (a ^ b) % MASK
            b = carry % MASK
        return a if a <= MAX_INT else ~((a%MIN_INT) ^ MAX_INT) #
# ~((a % MIN_INT) ^ MAX_INT) 为什么要对负数做这样的处理呢? 
#因为在python中int不是32位的,输出是64位,所以一个负数比如-2, 64位表示就是0x00000000FFFFFFFE, 
#用python求取这个16进制的值int('0x00000000FFFFFFFE', 16), 得到的数字是4294967294 不是我们想
#的-2,所以: a^mask是先对a的前32位取反,对应-2,就得到0x0000000000000002 再用~操作符对所以位置取
#反,对应-2,得到0xFFFFFFFFFFFFFFFE
#总结一下就是,由于oj系统python最后返回的是64位,如果不对负数特殊处理,那么负数的前32位是0,最后输出的是
#大于32位的正数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值