方法介绍
cs
public string AddBinary(string a, string b)
{
int i = a.Length - 1;
int j = b.Length - 1;
int carry = 0;
string result = "";
while (i >= 0 || j >= 0 || carry > 0)
{
int sum = carry;
if (i >= 0)
{
sum += a[i] - '0';
i--;
}
if (j >= 0)
{
sum += b[j] - '0';
j--;
}
result = (sum % 2) + result;
carry = sum / 2;
}
return result;
}
这段代码实现的是两个二进制字符串的加法,返回它们的和(仍为二进制字符串)。以下是核心逻辑的总结:
- 输入 :两个二进制字符串
a
和b
(例如"1010"
和"1011"
)。 - 输出 :它们的二进制和(例如
"10101"
)。 - 算法 :
- 从字符串的末尾(最低位)开始逐位相加。
- 使用
carry
记录进位。 - 每次计算当前位的和(
sum
),并更新进位(carry = sum / 2
)。 - 将当前位的值(
sum % 2
)拼接到结果字符串的左侧。
隐式转换说明
代码中涉及以下隐式转换(由编译器自动完成):
1. 字符到整数的转换
cs
sum += a[i] - '0';
a[i]
是一个字符('0'
或'1'
)。'0'
的 ASCII 值是48
,'1'
是49
。a[i] - '0'
通过减法将字符隐式转换为整数:'0' - '0' = 0
'1' - '0' = 1
2. 整数到字符的转换
cs
result = (sum % 2) + result;
sum % 2
的结果是0
或1
(整数)。- 在与字符串
result
拼接时,整数被隐式转换为字符:0
→'0'
1
→'1'
3. 整数除法的截断
cs
carry = sum / 2;
sum / 2
是整数除法,结果会被截断为整数:- 若
sum = 2
,则carry = 1
。 - 若
sum = 1
,则carry = 0
。
- 若
关键点分析
-
字符与整数的转换:
- 通过
- '0'
将字符'0'
/'1'
转换为整数0
/1
,是二进制字符串处理的常见技巧。 - 反向转换(整数 → 字符)通过字符串拼接自动完成。
- 通过
-
进位逻辑:
sum
的范围是0
、1
或2
(因为每位相加的最大值是1 + 1 + 1 = 3
)。sum % 2
得到当前位的值,sum / 2
得到进位值。
-
字符串拼接的方向:
- 结果是从最低位开始构建的,因此每次拼接在字符串的左侧 (
result = (sum % 2) + result
)。
- 结果是从最低位开始构建的,因此每次拼接在字符串的左侧 (
示例演示
以 a = "1010"
(十进制 10)和 b = "1011"
(十进制 11)为例:
- 初始状态 :
i = 3
,j = 3
,carry = 0
,result = ""
。
- 逐步计算 :
- 第一轮:
sum = 0 + 0 + 1 = 1
→result = "1"
,carry = 0
。 - 第二轮:
sum = 0 + 1 + 1 = 2
→result = "01"
,carry = 1
。 - 第三轮:
sum = 1 + 0 + 0 = 1
→result = "101"
,carry = 0
。 - 第四轮:
sum = 0 + 1 + 1 = 2
→result = "0101"
,carry = 1
。 - 第五轮:
sum = 1
→result = "10101"
,carry = 0
。
- 第一轮:
- 结果 :
"10101"
(十进制 21)。
优化建议
-
使用
StringBuilder
:-
当前方法通过字符串拼接效率较低,建议改用
StringBuilder
的Insert(0, value)
方法。 -
示例:
csvar sb = new StringBuilder(); sb.Insert(0, sum % 2);
-
-
边界条件处理:
-
如果输入为空字符串,可以直接返回另一个字符串:csharp
插入
复制
新建文件
保存
应用代码
csif (string.IsNullOrEmpty(a)) return b; if (string.IsNullOrEmpty(b)) return a;
-
总结
- 隐式转换:通过字符与整数的加减实现类型转换,是二进制字符串处理的核心技巧。
- 算法效率 :时间复杂度为
O(n)
(n
是较长字符串的长度),但字符串拼接部分可以优化。 - 适用场景:适用于任意长度的二进制字符串加法。