Question
Given two binary strings, return their sum (also a binary string).
For example,
a = “11”
b = “1”
Return “100”.
JavaCode
public String addBinary(String a, String b) {
//选择较长的String用于存储相加的结果
StringBuffer l = new StringBuffer();
String s = null;
if(a.length() > b.length()) {
l.append(a);
s = b;
}else {
l.append(b);
s = a;
}
boolean carry = false;//标记每次低位相加之后是否有进位
int diff = l.length() - s.length();
char ch1, ch2;
//计算两个二进制数各个对应数位之和
for(int i = l.length() - 1; i >= diff; --i) {
ch1 = l.charAt(i);
ch2 = s.charAt(i-diff);
if(ch1 == '1' && ch2 == '1') {
if (!carry) {//如果低位没有进位
carry = true;//则本次相加之后产生进位
l.setCharAt(i, '0');//保存当前二进制位相加的结果
}//如果低位有进位,则相加之后仍有进位(本逻辑分支无需任何操作)
}else if(ch1 == '0' && ch2 == '0'){
if (carry) {
carry = false;
l.setCharAt(i, '1');
}
}else {
if (carry) {
if(ch1 == '1')
l.setCharAt(i, '0');
}else if(ch1 == '0'){
l.setCharAt(i, '1');
}
}
}
//处理较长的加数中可能的连续进位
while(diff-- > 0){
if(carry) {
if(l.charAt(diff) == '1')
l.setCharAt(diff, '0');
else {
l.setCharAt(diff, '1');
carry = false;
break;//没有进位则结束继续进位的操作
}
}
}
//处理最高位上可能的进位并返回相加结果
if(carry)
return l.insert(0, '1').toString();
else
return l.toString();
}
说明
如果本题中输入的两个二进制字符串不太长(测试用例并未保证如此),则可以使用基本数据类型的包装类直接进行解析和转换,代码将很简洁:
public String addBinary(String a, String b) { return Long.toBinaryString(Long.parseLong(a, 2) + Long.parseLong(b, 2)); }