leetcode 371. Sum of Two Integers 按位操作 python3

一.问题描述

Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -.

Example 1:

Input: a = 1, b = 2
Output: 3

Example 2:

Input: a = -2, b = 3
Output: 1

二.解题思路

如果这道题你不用类似 sum([a,b] 这种取巧的操作,而是真正实现出题者想要考察的地方,你会发现这道题还是有点东西的。

这道题要求对计算机底层的计算有所了解。

计算机在底层进行数值计算的时候都是先将数用补码表示,然后再从计算完之后再转换成源码返回。

具体相关的可以参考这篇博客。

https://blog.csdn.net/u011240016/article/details/52433355

最重要的一点就是这个:

加法:
整数: [A]补 + [B]补 = [A+B]补 (mod 2^(n+1))
小数: [A]补 + [B]补 = [A+B]补 (mod 2)

减法:
整数: [A-B]补 = [A]补 + [-B]补 (mod 2^(n+1))
小数: [A-B]补 = [A]补 + [-B]补(mod 2)
————————————————
版权声明:本文为CSDN博主「DrCrypto」的原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u011240016/article/details/52433355

可知通过补码,其实加减法都是加法。

因此我们只需要实现加法。

加法来说就是,两个数相与得到需要进位的地方,

然后将进位与上面两数想加的结果进行想加,同样的方法计算进位,

直到进位为0.

注意的地方有2点:

1.python不像C++ Java, 麻烦的一点是数值其实是没有位数限制的,要命的是题目也没给 数的范围, 根据C++那边的情况,应该是32位整型。

2.注意一下如果进位超过第32位说明数值溢出,截取一下。

更多leetcode算法题解法: 专栏 leetcode算法从零到结束

三.源码

代码参考:https://leetcode.com/problems/sum-of-two-integers/discuss/400375/python-methods-%3A-easy-to-understand

class Solution:
    #47
    def getSum(self, a: int, b: int) -> int:
        
	
        # Prevent negative number
        while b & 0xffffffff: # b & 0xffffffff will remain the same as b with 32 bit 
            c = a & b
            a = a ^ b
            b = c << 1
        
        return a & 0xffffffff if b > 0xffffffff else a
发布了218 篇原创文章 · 获赞 191 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/CSerwangjun/article/details/103089720
今日推荐