解决方案 »

  1.   

    可以直接用string来模拟这个加法
     public static void main(String[] args) {
    // TODO Auto-generated method stub
    String data1 = "111010100101010101010010101010101111000101";
    String data2 = "010101010101001001011010";
    String ret = binarySum(data1, data2);
    System.out.println(ret);
    } public static String binarySum(String s1, String s2) {
    if (s1 == null || s2 == null)
    return null;
    StringBuilder sb = new StringBuilder();
    int len1 = s1.length() - 1;
    int len2 = s2.length() - 1;
    int a, b, c = 0;// c记录进位
    if (len1 > len2) {
    for (; len2 >= 0; len1--, len2--) {
    a = s1.charAt(len1) - '0';
    b = s2.charAt(len2) - '0';
    int tmp = a + b + c;
    c = tmp / 2;
    tmp = tmp % 2;
    sb.insert(0, tmp);
    } for (; len1 >= 0; len1--) {
    a = s1.charAt(len1) - '0';
    int tmp = a + c;
    c = tmp / 2;
    tmp = tmp % 2;
    sb.insert(0, tmp);
    }
    if (c > 0)
    sb.insert(0, c);
    } else {
    for (; len1 >= 0; len1--, len2--) {
    a = s1.charAt(len1) - '0';
    b = s2.charAt(len2) - '0';
    int tmp = a + b + c;
    c = tmp / 2;
    tmp = tmp % 2;
    sb.insert(0, tmp);
    }
    for (; len2 >= 0; len2--) {
    a = s2.charAt(len2) - '0';
    int tmp = a + c;
    c = tmp / 2;
    tmp = tmp % 2;
    sb.insert(0, tmp);
    }
    if (c > 0)
    sb.insert(0, c);
    }
    return sb.toString();
    }
      

  2.   

    高大上的BitSet版本且部分模拟了电子电路进行加法计算时候的操作import java.util.BitSet;public class Bin {  public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
          String a = Integer.toBinaryString(i);
          for (int j = 0; j < 10; j++) {
            String b = Integer.toBinaryString(j);
            String c = Integer.toBinaryString(i + j);
            String actual = add(a, b);
            System.out.printf("Expected: %d(%s)+%d(%s)=%d(%s), actual: %s%n",
                              i,
                              a,
                              j,
                              b,
                              i + j,
                              c,
                              actual);
            if (!c.equals(actual)) {
              throw new RuntimeException();
            }
          }
        }
        char[] _1024 = new char[1024];
        Arrays.fill(_1024, '0');
        _1024[0] = '1';
        String a = new String(_1024); // 10000...00000
        Arrays.fill(_1024, '0');
        _1024[0] = '1';
        _1024[1023] = '1';
        String b = new String(_1024); // 10000...00001
        
        char[] _1025 = new char[1025];
        Arrays.fill(_1025, '0');
        _1025[0] = '1';
        _1025[1024] = '1';
        String c = new String(_1025);
        String actual = add(a, b);
        System.out.println(actual); // 100000...00001
        System.out.println(actual.equals(c));
      }  public static String add(String a, String b) {
        BitSet bsA = toBitSet(a);
        BitSet bsB = toBitSet(b);
        BitSet xor = (BitSet) bsA.clone();
        xor.xor(bsB); // 异或门:原本两数相同位置的加法结果(不含进位情况)
        BitSet and = (BitSet) bsA.clone();
        and.and(bsB); // 与门:原本两数相同位置相加是否有进位情况(不考虑地位进位导致的进位)
        for (int i = 0; i < and.length(); i++) {
          if (!and.get(i)) {
            continue; // 原来两数不是都是1,所以不需要进1
          }
          int start = i + 1; // 当前位置+1(1+1需要进1)
          int end = xor.nextClearBit(start); // 最近一个0
          xor.clear(start, end); // start(含)~end(不含)位置清零
          xor.set(end); // end位置1
        }
        return toString(xor);
      }  private static BitSet toBitSet(String num) {
        if (num == null || !num.matches("^[01]+$")) {
          throw new IllegalArgumentException();
        }
        char[] chars = num.toCharArray();
        BitSet bs = new BitSet(chars.length);
        for (int i = 0; i < chars.length; i++) {
          if (chars[chars.length - 1 - i] == '1') {
            bs.set(i);
          }
        }
        return bs;
      }  private static String toString(BitSet bs) {
        if (bs.length() == 0) {
          return "0";
        }
        char[] chars = new char[bs.length()];
        for (int i = 0; i < chars.length; i++) {
          chars[i] = bs.get(chars.length - 1 - i) ? '1' : '0';
        }
        return new String(chars);
      }
    }
      

  3.   

    and.and(bsB); // 与门:原本两数相同位置相加是否有进位情况(不考虑位进位导致的进位)