{{docContent.title}}

(模拟法和位运算)二进制求和

解法一:模拟法

这里的模拟法本质上就是通过模拟我们的列竖式的方法,通过末尾对齐,然后逐位相加。

func addBinary(a string, b string) string {
	//  最终结果
	ans := ""
	// 表示上一位的进位
	carry := 0
	// 获取AB的长度
	lenA, lenB := len(a), len(b)
	// 获取两个中最大的一个的长度
	n := max(lenA, lenB)

	for i := 0; i < n; i++ {
		// 确保加的数要小于数组的长度
		if i < lenA {
			// 这里我们使用carry作为这一位的进位计算(carry=carry(上一位)+ai+bi)
			carry += int(a[lenA-i-1] - '0')
		}
		if i < lenB {
			// 这个和上面是一样的,如果上面的加完了,那么这一位计算就只会加上bi
			carry += int(b[lenB-i-1] - '0')
		}
		// 这里是计算,相当于把计算的结果都拼接起来
		ans = strconv.Itoa(carry%2) + ans
		// 这里是计算进位,因为我们是二进制运算,如果carry为1,那么就没有进位,计算的结果为0,否则计算的结果为1
		carry /= 2
	}
	if carry > 0 {
		ans = "1" + ans
	}
	return ans
}

func max(x, y int) int {
	if x > y {
		return x
	}
	return y
}

解法二 朴素法

这个方法其实就是先把字符串转换为int类型,然后直接计算,最后再把计算结果转换为二进制的形式,下面这个解法使用Python一行代码即可实现

class Solution:
    def addBinary(self, a, b) -> str:
        return '{0:b}'.format(int(a, 2) + int(b, 2))

解法三 位运算