题目:
写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
示例:输入: a = 1, b = 1 输出: 2
提示:a, b 均可能是负数或 0 结果不会溢出 32 位整数
解题思路:
本题考查用位运算进行加法运算。有一个规律:
观察可以发现,无进位和与异或运算规律相同,进位和与运算规律相同(并需左移一位)。因此,无进位和n与进位c的计算公式如下:
c=a&b<<1
循环求n和c,直至进位c=0;此时s=n,返回n即可。
如果a和b中出现负数,则将负数用补码来表示。
代码:
class Solution:
def add(self, a: int, b: int) -> int:
a&=0xFFFFFFFF
b&=0XFFFFFFFF
while b!=0:
carry=a&b
a^=b
b=(carry<<1)&0xFFFFFFFF
return a if a<0x80000000 else ~(a^0xFFFFFFFF)
复杂度:
- 时间复杂度:O(1),每轮中的常数次位操作使用O(1)
- 空间复杂度:O(1),使用常数大小的额外空间