二进制位异或运算相当于对应位相加,不考虑进位
比如: 1 ^ 1 = 0 ---> 1 + 1 = 0 (当前位值为0,进一位)
1 ^ 0 = 1 ---> 1 + 0 = 1 (当前位值为1)
0 ^ 0 = 0 ---> 0 + 0 = 0 (当前位值为0)
二进制位与运算相当于对应位相加之后的进位
比如: 1 & 1 = 1 ---> 1 + 1 = 0 (当前位的值进一位)
1 & 0 = 0 ---> 1 + 0 = 1 (当前位的值不进位)
0 & 0 = 0 ---> 0 + 0 = 0 (当前位的值不进位)
两个数相加:对应二进制位相加的结果 + 进位的结果
比如:3 + 2 --> 0011 + 0010
0011 ^ 0010 = 0001
0011 & 0010 = 0010 需要进位变成 0100 也就是<<1
当进位之后的结果为0时,相加结束。
代码
func getSum(a int, b int) int {
for b != 0 {
sum := a ^ b
carry := (a & b) << 1
a = sum
b = carry
}
return a
}
作者:ba-xiang
链接:https://leetcode-cn.com/problems/sum-of-two-integers/solution/wei-yun-suan-by-ba-xiang/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。