不用加减乘除做加法
题目
写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
思路 利用位运算
s
=
a
+
b
=
n
+
c
s=a+b=n+c
s=a+b=n+c
其中:
{
n
=
a
⊕
b
非
进
位
和
:
异
或
运
算
c
=
a
&
b
进
位
:
与
运
算
+
左
移
一
位
\begin{cases} n=a⊕b & 非进位和:异或运算\\ c=a\&b & 进位:与运算+左移一位 \end{cases}
{n=a⊕bc=a&b非进位和:异或运算进位:与运算+左移一位
注意1: LeetCode c++ 不允许负数左移操作,所以要转换成无符号整数。
注意2: python负数的存储
C++
class Solution {
public:
int add(int a, int b) {
while (b) {
int carry = (unsigned int)(a & b) << 1; //只进位的结果
a = a^b; //不进位的结果
b = carry;
}
return a;
}
};
python
class Solution:
def add(self, a: int, b: int) -> int:
a &= 0xffffffff
b &= 0xffffffff
while b != 0:
carry = ((a & b) << 1) & 0xffffffff
a ^= b
b = carry
return a if a < 0x80000000 else ~(a^0xffffffff)
举一反三