leetcode刷题-67二进制求和

题目

给你两个二进制字符串,返回它们的和(用二进制表示)。

输入为 非空 字符串且只包含数字 1 和 0。

 

示例 1:

输入: a = "11", b = "1"
输出: "100"

思路

位运算:

以13的二进制为0000 1101,9的二进制为0000 1001为例子

    1. 不考虑进位,分别对各位数进行相加:
      sum = 0000 1101 + 0000 1001 = 0000 0100

    2. 考虑进位:
      有两处进位,第0位和第3位,只考虑进位的结果为:
      carry = 0001 0010

    3. 在步骤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:]

 

posted @ 2020-08-07 11:09  maoguai  阅读(95)  评论(0编辑  收藏  举报