我试图将二进制数乘以2,而不用其他计数系统。
我的算法是:
终止点很可能是错误的,我可以轻松修复通过标志(在步骤1)和if语句,以确定循环结束(步骤2)变量
String ori = "10001";
char[] arry = ori.toCharArray();
System.out.println("start: " + new String(arry));
if (arry[0] == '1') {
arry = ("1" + ori).toCharArray();
arry[1] = '0';
}
System.out.println("start: " + new String(arry));
for (int i = arry.length - 1; i > 0; i--) { // not the lend digi
if (isOneThenChange(arry, i)) {
// hunt down next 0
int index = hunt(arry, i);
if (index == -1) {
for (int ii = 0; ii < arry.length; ii++) {
System.out.print(arry[ii]);
}
System.exit(0);
}
System.out.println("index is: " + index);
System.out.println("01234564");
System.out.println(arry);
// make it into 1
arry[index] = '1';
// make the 1s in between 0s..
//// safe assumption index.. i and all 1s
for (int k = index - 1; k < i; k++) {
arry[k] = '1';
}
}
// Continue the loop and look for the next one
}
System.out.println("end: " + new String(arry));
追捕0的方法:
private static int hunt(char[] arry, int i) {
for (int j = i; j > 0; j--) {
if (arry[j] == '0')
return j;
}
return -1;
}
将位从1翻转到0的方法:
private static boolean isOneThenChange(char[] a, int i) {
if (a[i] == '1') {
a[i] = '0';
return true;
}
return false;
}
}
我没有成功调试我的代码,我怀疑它是在步骤3,4,5
如何调试我的算法,让它按预期运行?
答案 0 :(得分:4)
在二进制中,如果向左移动,则乘以2.因此,就字符串而言,如果附加0
,则实际上乘以2。
x = 1110 // 14 in decimal
x << 1 // 28 in decimal
但是,因为你正在使用字符串:
String x = "1110"; // 14 in decimal
// As long as x != 0, append "0"
if (!x.equals("0")) {
x = x + "0"; // 11100 = 28
}
与在10号基数上向左移动乘以10相同:
12
120
1,200
对于任何基数(基数),向左移动一个乘以你的数字乘以基数。 (在这种情况下是基数2)。向右移动有效地将数字除以基数,然后向下舍入。