题目 :给你两个整数 a 和 b, 不应用 运算符 + 和 – ,计算并返回两整数之和。
链接:力扣 Leetcode—中级算法—其余—两整数之和.
示例 1:
输出:a = 1, b = 2
输入:3
示例 2:
输出:a = 2, b = 3
输入:5
标签:位运算、数学
思路:题目要求了不能应用运算符 + 和 –,于是,咱们应用位运算来解决这个问题。
位运算中的两数加法,也就上面这四种:
0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 0 (进位)
咱们来看一个例子:
a = 5 = 0101
b = 4 = 0100
a ^ b 如下:(异或:如果 a、b 两个值不雷同,则异或后果为 1。如果 a、b 两个值雷同,异或后果为 0。)
0 1 0 1
0 1 0 0
-------
0 0 0 1
a ^ b 失去了一个 无进位加法 后果,如果要失去 a + b 的最终值,咱们还要找到 进位 的数,把这二者相加。在位运算中,咱们能够应用 与 操作取得进位:
a = 5 = 0101
b = 4 = 0100
a & b 如下:(与:两位同时为“1”,后果才为“1”,否则为 0)
0 1 0 1
0 1 0 0
-------
0 1 0 0
由计算结果可见,0100 并不是咱们想要的进位,1 + 1 所取得的进位应该要搁置在它的更高位,即左侧位上,因而咱们还要把 0100 左移一位,才是咱们所要的进位后果。
那么问题就容易了,总结一下:
a + b 的问题拆分为 (a 和 b 的无进位后果) + (a 和 b 的进位后果)
- 无进位加法应用异或运算 (^) 计算得出
- 进位后果应用与运算 (&) 和移位运算 (<<) 计算得出
- 循环此过程,直到进位为 0
全副 Go 代码如下:
package main
import "fmt"
func getSum(a int, b int) int {
// 按位取异或
result := a ^ b
// 判断是否须要进位
forward := (a & b) << 1
if forward != 0 {
// 如有进位,则将二进制数左移一位,进行递归
return getSum(result, forward)
}
return result
}
func main() {fmt.Println(getSum(2, 3))
}
提交截图: