题目:给定两个二进制数字字符串A、B,计算出A+B并返回和值的字符串
算法一:最原始的办法,模拟二进制的运算,因考虑到给定的二进制字符串很长,所以使用Java的BigInteger实现
import java.math.BigInteger;
public class Solution {
/**
* Convert binary number to BigInteger.
* @param binary
* @return
*/
public BigInteger convertBinaryToBigInteger(String binary) {
BigInteger factor = BigInteger.ONE;
BigInteger convert = BigInteger.ZERO;
int length = binary.length();
for (int i=length-1; i>=0; --i) {
long num = (long)(binary.charAt(i)-'0');
convert = convert.add(factor.multiply(BigInteger.valueOf(num)));
factor = factor.shiftLeft(1);
}
return convert;
}
/**
* Convert BigInteger to binary number.
* @param c
* @return
*/
public String convertBigIntegerToBinary(BigInteger c) {
if (c.equals(BigInteger.ZERO)) {
return "0";
}
String res = new String();
BigInteger factor = BigInteger.valueOf(2L);
while (!c.equals(BigInteger.ZERO)) {
res += c.mod(factor).toString();
c = c.divide(factor);
}
return new StringBuffer(res).reverse().toString();
}
/**
* Add Two given binary number and return the binary number of their sum.
* @param a
* @param b
* @return
*/
public String addBinary(String a, String b) {
BigInteger aBigInteger = convertBinaryToBigInteger(a);
BigInteger bBigInteger = convertBinaryToBigInteger(b);
return convertBigIntegerToBinary(aBigInteger.add(bBigInteger));
}
}
算法二:利用异或运算,这种方法更加优雅
public String addBinary(String a, String b) {
String convert = new String();
char[] aArray = a.toCharArray();
char[] bArray = b.toCharArray();
int aByte = 0;
int bByte = 0;
int carry = 0;
int aIndex = aArray.length - 1;
int bIndex = bArray.length - 1;
while (aIndex>-1 || bIndex>-1 || carry>0) {
aByte = aIndex > -1 ? Character.getNumericValue(aArray[aIndex--]) : 0;
bByte = bIndex > -1 ? Character.getNumericValue(bArray[bIndex--]) : 0;
convert += String.valueOf(aByte ^ bByte ^ carry);
carry = (aByte + bByte + carry) > 1 ? 1 : 0;
}// end of while
return new StringBuffer(convert).reverse().toString();
}