题目描述:(这第一种方法我就不多说了,肯定是有手就行)
给你两个整数 num1 和 num2,返回这两个整数的和。
示例 1:
输入:num1 = 12, num2 = 5
输出:17
解释:num1 是 12,num2 是 5 ,它们的和是 12 + 5 = 17 ,因此返回 17 。
示例 2:
输入:num1 = -10, num2 = 4
输出:-6
解释:num1 + num2 = -6 ,因此返回 -6 。
第一种
class Solution {
public int sum(int num1, int num2) {
return num1+num2;
}
}
让我们来看看第二种方法
位运算
class Solution {
public int sum(int num1, int num2) {
while (num2 != 0) {
int carry = (num1 & num2) << 1;
num1 ^= num2;
num2 = carry;
}
return num1;
}
}
老样子,贴上作者的链接作者ylb
然后分析分析:
首先就是位运算符这个 ^ 这里,和左神学过这个印象还算比较深,我就简单的举个例子供自己和大家理解(b站左神视频下面的例子,就直接引用了)
a=1;
b=2;
c=a^b; // c为1和2的异或数3
a=a^c; // 1^3等于2,a变为2
b=b^c; // 2^3等于1,b变为1
完成互换。
简化后:
a=1;
b=2;
a=a^b; // a为1和2的异或数3
b=a^b; // 3^2等于1,b变为1
a=a^b; // 3^1等于2,a变为2
还有换成二进制的理解方法
1= 001;2=010;3=011;
a=1;//001
b=2;//010
c=a^b; //001 和 010 的异或数 011
b=c^b; //011 和 010 的亦或数 001
a=c^b; //011 和 001 的亦或数 010
嗯,这样我们就都懂了这个操作是什么意思了
num1 ^= num2;
num2 = carry;
接下来为了方便理解,我们可以再举个例子
假设
num1=5 //101
num2=3 //011
carry = (num1 & num2) << 1; //carry = (101 & 011) << 1 = 001 << 1 = 101 = 2
num1 ^= num2 // num1 = num1 ^ num2 = 5 ^ 3 = 101 ^ 011 = 110 = 6
num2 = carry = 101 = 2
这是题解下面的一句话 return num2 ? sum(num1^num2, (num1&num2)<<1) : num1;
也是题解之一,不知道你们看没看懂啊,意思和上面的应该是一样的。
在纸上画画应该比较好懂,我想明白再补。