剑指 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)

浙公网安备 33010602011771号