题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、×、÷ 四则运算符号。
样例
输入:num1 = 1 , num2 = 2
输出:3
算法
(位运算)
- A + B 分为2个部分,
A^B
是不进位加法,(A&B) << 1
是进位,二者相加就起到了相同的作用。 - 因为
A + B = A^B + ((A&B) << 1)
,所以说 还是会用到加号+,对此我们的解决方案是 使用一个while()循环,不断迭代赋值,将 异或的结果和进位的结果分别变成a和b,因为b
不断左移,所以总有一天会变成0,这时候while就跳出来。答案一直存储在a
里面,也就是异或(不进位加法)中,最后进位b=0,a没有必要进位了,答案就是最后的a。
时间复杂度
C++ 代码
class Solution {
public:
int add(int a, int b){
while(b)
{
int sum = a ^ b;
int carry = (a & b) << 1;
a = sum;
b = carry;
}
return a;
}
};
”因为b不断左移,所以总有一天会变成0“这句话错了吧,是与的结果迟早是零,所以右移的结果才是零
emmm,好像你说的也有点对,但感觉有点绝对,左移32次必定为0,但也会中途变为0,那就是与的结果
现在这个在Leetcode上面已经过不了了。
C++ 不允许负数进行左移操作,故要加 unsigned int
负数也可以吧,刚刚试了一下