解决方案 »
- 是大神就来瞧瞧-------EditText多行显示时,在行末输入空格不会自动换行问题!!!!!!!!!!
- 选项卡的实现中Framelayout怎么布局控件?
- MapView如何显示可以指示方向的蓝色小箭头
- 图片压缩网络传输
- 想要实现开发一个小的安卓系统
- android word转pdf
- 谁用过RED5在android实时播放视频?
- 新人求助。。。
- 这种Android弹出框是用什么做的呢?
- Android开发中, 用jdbc直连mysql数据库,一直失败,求大佬们救救孩子qwq
- [微信开放平台]微信客户端未登录时,第三方程序发送分享请求再登陆后并没有发出去?
- SDK更新至22.6以后新手的关于findViewById的疑问
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();
}
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);
}
}