# 二进制求和 给你两个二进制字符串,返回它们的和(用二进制表示)。 输入为 非空 字符串且只包含数字`1`和`0`。 ## 示例 ``` 输入: a = "11", b = "1" 输出: "100" ``` ``` 输入: a = "1010", b = "1011" 输出: "10101" ``` ## 提示 * 每个字符串仅由字符`'0'`或`'1'`组成。 * `1 <= a.length, b.length <= 10^4`。 * 字符串如果不是`"0"`,就都不含前导零。 ## 题解 ```javascript /** * @param {string} a * @param {string} b * @return {string} */ var addBinary = function(a, b) { var longer = ""; var shorter = ""; if(a.length > b.length){ longer = a; shorter = b.padStart(a.length,0); }else{ longer = a.padStart(b.length,0); shorter = b; } var target = ""; var addition = 0; for(let i=longer.length-1;i>=0;--i){ let unitNum = ~~(longer[i]) + ~~(shorter[i]) + addition; addition = 0; if(unitNum >= 2) { addition = 1; target = `${unitNum-2}${target}`; }else{ target = `${unitNum}${target}`; } } if(addition) target = `1${target}`; return target; }; ``` ## 思路 首先需要将两个字符串的长度进行统一,判断两个字符串长度的长度,然后选出短的字符串在字符串前填充`0`,也就是使用`String.prototype.padStart()`方法进行填充,然后定义目标字符串以及进位标记变量,然后从后开始往前遍历字符串,将字符串中的字符转换成数字类型然后相加并与进位变量相加,其中`~~`就是利用位运算将字符转换成数字,相加完成后将进位标志置为`0`,然后判断字符是否大于`2`,如果大于等于`2`则将相加的字符减掉`2`并将进位标记记为`1`,若小于`2`则直接拼接字符串,然后不断循环完成目标字符的拼接,若最后依然有进位标志,则直接拼接`1`到目标字符串前,然后返回目标字符串即可。 ## 每日一题 ``` https://github.com/WindrunnerMax/EveryDay ``` ## 题源 ``` https://leetcode-cn.com/problems/add-binary ```