学习笔记:二进制字符串加法及其十进制转换
题目描述
给定两个二进制字符串 binary1 和 binary2,对其进行二进制加法,返回十进制字符串结果。 例如:
- 输入:
binary1 = "101",binary2 = "110"输出:"11"(二进制101加110为1011,十进制为11)
题目解析
1. 思路分析
这道题主要考察二进制加法以及处理进位的逻辑。步骤如下:
-
统一长度:二进制字符串长度可能不一致,需通过前置补零使它们长度相等,方便逐位运算。
-
逐位相加,处理进位:
- 从最低位开始,逐位相加,并记录每次的进位。
- 当前位的结果是
(bit1 + bit2 + carry) % 2。 - 更新进位为
(bit1 + bit2 + carry) // 2。
-
处理最高位进位:加法完成后,若进位为1,则需在结果前添加
1。 -
结果转换:将最终的二进制字符串转换为十进制字符串。
2. 示例分析
以输入 binary1 = "101", binary2 = "110" 为例:
-
补零对齐:
binary1 = "101",binary2 = "110" -
逐位加法:
- 第三位:
1 + 0 + 0(carry)=1,结果1,进位0 - 第二位:
0 + 1 + 0(carry)=1,结果11,进位0 - 第一位:
1 + 1 + 0(carry)=2,结果011,进位1
- 第三位:
-
处理进位:最终结果为
1011,转换为十进制为11。
代码实现
def solution(binary1, binary2):
# 确保两个二进制字符串长度相同,前面填充0
len_max = max(len(binary1), len(binary2))
binary1 = binary1.zfill(len_max)
binary2 = binary2.zfill(len_max)
carry = 0 # 进位
result = '' # 结果
# 从最低位开始遍历字符串
for i in range(len_max - 1, -1, -1):
bit1 = int(binary1[i])
bit2 = int(binary2[i])
sum_bits = bit1 + bit2 + carry # 当前位的和加上进位
carry = sum_bits // 2 # 更新进位
result = str(sum_bits % 2) + result # 计算当前位的结果
# 如果最后还有进位,需要添加到结果的最高位
if carry > 0:
result = '1' + result
# 将二进制结果转换为十进制字符串
return str(int(result, 2))
if __name__ == "__main__":
# 测试用例
print(solution("101", "110")) # 输出 "11"
print(solution("111111", "10100")) # 输出 "83"
print(solution("111010101001001011", "100010101001")) # 输出 "242420"
print(solution("111010101001011", "10010101001")) # 输出 "31220"
知识总结
1. 二进制加法基础
-
二进制加法规律:
加法 结果 进位 0+0 0 0 0+1 1 0 1+1 0 1 1+1+1(carry) 1 1 -
实现时通常从最低位开始逐位加,并注意更新进位。
2. zfill 方法
Python 的 zfill 方法非常适合处理字符串长度不足的问题,它会在字符串左侧补零,确保两字符串长度一致。
3. Python 字符串拼接与类型转换
-
拼接:在字符串的操作中,常用
result = str(…) + result来在结果前添加字符。 -
类型转换:
int(binary, 2):将二进制字符串转为十进制整数。str(value):将整数转为字符串。
学习建议
- 强化基础:二进制运算是计算机基础,多练习二进制加减法,理解进位与补码规则。
- 分解问题:复杂问题拆解为小问题,逐步解决,比如这题的“补零”、“逐位运算”、“处理进位”。
- 关注内置函数:熟悉字符串操作的内置方法,如
zfill、类型转换函数,提升代码简洁性。 - 实践练习:可以拓展此题,试试三进制、四进制等其他数制加法,进一步巩固知识点。
图解
以下是例题 binary1 = "101", binary2 = "110" 的加法过程:
Step 1: 补零对齐
binary1: 101
binary2: 110
Step 2: 从右到左逐位相加
位1: 1+0+0(carry)=1,结果 1,进位 0
位2: 0+1+0(carry)=1,结果 11,进位 0
位3: 1+1+0(carry)=2,结果 011,进位 1
Step 3: 处理最高位进位
最终结果为 1011 (二进制) -> 11 (十进制)