力扣题解系列:剑指 Offer 65. 不用加减乘除做加法

    技术2025-12-16  7

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

    题目描述:

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

    思路都在代码里

    代码:

    class Solution: def add(self, a, b) -> int: a &= 0xffffffff b &= 0xffffffff # python 因为位数没有限制,所以负数补码会很长,所以要位与 0xffffffff 处理成32位整型数。 while b: carry = ((a & b) << 1) & 0xffffffff # 计算进位 # 左移相当于乘二,可能越界 a ^= b # 计算计算无进位加法 b = carry # 把b换成进位,若进位不为0,则进入下一次循环 if a < 0x80000000: # 0x80000000是负数的最小值 # 0x7fffffff是正数的最大值 # a<0x80000000说明a是正数 # 直接返回a即可 return a else: # 若a是负数 # a^0xffffffff按位与,得到负数的绝对值,需要再对其整体取反 return ~(a^0xffffffff)

    加点东西:

    一些位运算应用:

    (1)判断奇偶 a和1按位于,若a为奇数结果为1,偶数结果为0 因为奇数二进制最后一位是1,偶数二进制最后一位是0

    (2)交换数值a,b a ^= b b ^= a a ^= b 因为a(ab)=aab=0^b=b(交换律)

    (3)寻找列表中只出现一次的数字 交换律

    (4)计算一个数的二进制中有多少个1 x与(x-1)进行&运算,可以检出x的二进制中存在的最后一个1 如:

    x = 1110 0000 x-1 = 1101 1111 x = x&(x-1) = 1100 0000 循环直到x=0

    Processed: 0.012, SQL: 10