乐趣区

关于golang:Golang力扣Leetcode中级算法其他两整数之和位运算

题目 :给你两个整数 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))
}

提交截图

退出移动版