剑指offer25 — 不用加减乘除做加法
题目
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
分析
-
基础知识
- 异或运算(
^)- 如果对应位值不同(1,0或者 0,1),做
^操作的运算结果为1,否则为0,也就相当于在不考虑进位的情况下做加法。
- 如果对应位值不同(1,0或者 0,1),做
- 与运算(
&)- 只有两个都是1的时候才是1,而在二进制中需要进位也是只有两个都为1的情况,那么可以通过做
&运算来找到需要进位的位置,并且左移来得到进位后的结果。
- 只有两个都是1的时候才是1,而在二进制中需要进位也是只有两个都为1的情况,那么可以通过做
- 按位取反
~~x = -(x+1)
- 异或运算(
-
思路:
- 重复
^运算和&操作(记得左移),直到&运算的结果为0,此时^的结果即为加法的结果。
- 重复
-
注意:
python中是变长度的,需要限制为32位,即与0xFFFFFFFF做^操作。此外,需要考虑^结果为负数的情况,为负数时,则需返回~(xorNum ^ 0xFFFFFFFF)
解
# -*- coding:utf-8 -*-
class Solution:
def Add(self, num1, num2):
# write code here
xorNum = num1 ^ num2
andNum = (num1 & num2) << 1
while andNum != 0:
tmp1 = xorNum ^ andNum
tmp2 = (xorNum & andNum) << 1
tmp1 = tmp1 & 0xFFFFFFFF
xorNum = tmp1
andNum = tmp2
return xorNum if xorNum <= 0x7FFFFFFF else ~(xorNum ^ 0xFFFFFFFF)
460

被折叠的 条评论
为什么被折叠?



