二进制求和
![](https://i-blog.csdnimg.cn/blog_migrate/11da0ef0b88f72dc11db9d3eb8bc9fe8.png)
public static String addBinary(String a, String b) {
return Integer.toBinaryString(Integer.parseInt(a,2)+Integer.parseInt(b,2));
}
为了适用于长度较大的字符串计算,我们应该使用更加健壮的算法。
模拟法
public static String addBi(String a, String b) {
int carry = 0;
StringBuilder builder = new StringBuilder();
int i = a.length()-1;
int j = b.length()-1;
//循环相加两个字符串相同长度的低位数部分
while (i>=0&&j>=0) {
int sum = carry;
//charAt拿到的数是一个 ASCLL码 需要- 48
sum = sum +a.charAt(i--)-'0';
sum = sum +b.charAt(j--)-'0';
//处理 如果得1 就进一位
carry = sum/2;
//正常拼接最后一位 可能是 0 或者 1
builder.append(sum%2);
}
// 如果 a 还没遍历完成(a串比b串长),则继续遍历添加 a 的剩余部分
while (i>=0) {
int sum = carry +a.charAt(i--)-'0';
carry = sum/2;
builder.append(sum%2);
}
// 如果 b 还没遍历完成(b串比a串长),则继续遍历添加 b 的剩余部分
while (j>=0) {
int sum = carry +b.charAt(j--)-'0';
carry = sum/2;
builder.append(sum%2);
}
//如果 carry 不等于0 还有个进位数没加进去,需要补充
if (carry == 1) {
builder.append(carry);
}
//反转字符串获得正常结果
return builder.reverse().toString();
}
![](https://i-blog.csdnimg.cn/blog_migrate/c207a61cafe88395120116d1d851b0a9.png)
![](https://i-blog.csdnimg.cn/blog_migrate/de82a35cb85fec2cd66b55419457f467.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1d2e069b06269e4378e486804989bf6a.png)