给你两个二进制字符串,返回它们的和(用二进制表示)。输入为非空字符串且只包含数字 1 和 0。
时间: 2024-04-30 10:17:33 浏览: 11
可以将两个二进制字符串先转化为十进制数,然后相加后再将和转化为二进制字符串。
代码如下:
```python
def addBinary(a: str, b: str) -> str:
# 将两个二进制字符串转化为十进制数
num_a = int(a, 2)
num_b = int(b, 2)
# 计算和
sum_num = num_a + num_b
# 将和转化为二进制字符串
res = bin(sum_num)[2:]
return res
```
其中,`int(a, 2)` 表示将二进制字符串 `a` 转化为十进制数,`bin(sum_num)` 表示将十进制数 `sum_num` 转化为二进制字符串。注意,转化后的二进制字符串前两个字符为 `'0b'`,需要去掉,所以用 `[2:]` 取子字符串。
相关问题
给你两个二进制字符串,返回它们的和(用二进制表示)。输入为非空字符串且只包含数字 1 和 0。用C++
以下是一个可能的 C 语言实现:
```c
#include <string.h>
#include <stdlib.h>
char* addBinary(char* a, char* b) {
int len_a = strlen(a);
int len_b = strlen(b);
int len_res = (len_a > len_b ? len_a : len_b) + 1;
char* res = (char*)malloc(sizeof(char) * (len_res + 1));
res[len_res] = '\0';
int carry = 0;
int i = len_a - 1;
int j = len_b - 1;
int k = len_res - 1;
while (i >= 0 || j >= 0 || carry > 0) {
int sum = carry;
if (i >= 0) sum += a[i--] - '0';
if (j >= 0) sum += b[j--] - '0';
res[k--] = sum % 2 + '0';
carry = sum / 2;
}
while (res[k + 1] == '0') k++;
if (k < 0) {
char* zero = (char*)malloc(sizeof(char) * 2);
zero[0] = '0';
zero[1] = '\0';
free(res);
return zero;
} else {
char* result = (char*)malloc(sizeof(char) * (len_res - k + 1));
memcpy(result, res + k + 1, len_res - k);
free(res);
return result;
}
}
```
该函数的参数是两个二进制字符串 `a` 和 `b`,返回值是它们的和的二进制字符串。其中,我们需要先确定结果字符串的长度 `len_res`,然后从低位到高位依次计算每一位的和,并且保存进位 `carry`。最后,我们需要去掉结果字符串的前导零,并且注意特殊情况,如 "0" + "0" = "0"。
给你两个二进制字符串 和 ,以二进制字符串的形式返回它们的和。ab
可以使用位运算来实现二进制字符串的加法。
首先将两个二进制字符串补齐到相同的长度,然后从低位到高位逐位相加,同时考虑进位。具体实现如下:
```python
def addBinary(a: str, b: str) -> str:
# 补齐到相同的长度
n = max(len(a), len(b))
a = a.zfill(n)
b = b.zfill(n)
# 从低位到高位逐位相加
carry = 0
ans = []
for i in range(n-1, -1, -1):
if a[i] == '1':
carry += 1
if b[i] == '1':
carry += 1
if carry % 2 == 1:
ans.append('1')
else:
ans.append('0')
carry //= 2
# 处理最高位的进位
if carry == 1:
ans.append('1')
ans.reverse()
return ''.join(ans)
```
例如,对于输入的两个二进制字符串 a = "1010" 和 b = "1011",输出的二进制字符串为 "10101",即十进制数的 10 + 11 = 21 的二进制表示。