leetcode刷题-67二进制求和
题目
给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。
示例 1:
输入: a = "11", b = "1"
输出: "100"
思路
位运算:
以13的二进制为0000 1101,9的二进制为0000 1001为例子
-
不考虑进位,分别对各位数进行相加:
sum = 0000 1101 + 0000 1001 = 0000 0100 -
考虑进位:
有两处进位,第0位和第3位,只考虑进位的结果为:
carry = 0001 0010 -
在步骤2中carry == 0 ?若不为0,重复步骤1 、2 、3;为0则结束,结果为sum:
本例中,
(a)不考虑进位sum = 0001 0110;
(b)只考虑进位carry = 0;
(c)carry == 0,结束,结果为sum = 0001 0110
转换成十进制刚好是22
因此可以通过位运算来完成计算
实现
class Solution: def addBinary(self, a: str, b: str) -> str: num1 = int(a,2) num2 = int(b,2) sum = num1 ^ num2; carry = (num1 & num2) << 1; while carry != 0: a = sum; b = carry; sum = a ^ b; carry = (a & b) << 1; return bin(sum)[2:]