剑指 Offer 65. 不用加减乘除做加法

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

方法:位运算  时间复杂度O(1)  空间复杂度O(1) 

不让用 + - * /,说明只能用位运算

由于python的存储机制,没有多少位的说法,理论上整型的长度为无限大(只和内存大小相关),python的负数存储形式是高位全是1,不像c之类的只有符号位表示正负,直接使用负数进行运算高位的无数个1可能会出问题,

这时就需要手动把负数32位以上的1全部置0,让他变成一个32位的整型进行计算,即 num & 0xffffffff,此时的二进制数就相当于十进制数的32位补码,可以直接拿来进行运算。

如何判断计算后的数是正负?

因为32位整数的最高位是符号位,故整数最大为0x7fffffff,若运算后的数值大于最大整数,说明是负数,需要将高位全部置1   即 ~(num ^ 0xffffffff) 即相当于把32位先取反,再全部取反,这样高位全是1,低32位不变

 

def add(a, b):
        """
        :type a: int
        :type b: int
        :rtype: int
        """
        x = 0xffffffff 
        a,b = a&x,b&x
        while b != 0:
            a,b = a^b,(a&b)<<1 & x
        return a if a <= 0x7fffffff else ~(a^x)

 

posted @ 2022-08-06 14:50  Liang-ml  阅读(21)  评论(0)    收藏  举报