【问题标题】:multiplying number in binary by two将二进制数乘以二
【发布时间】:2018-10-10 02:23:23
【问题描述】:

我正在尝试将二进制数乘以 2,而不是觊觎其他计数系统。

我的算法是:

  • 如果前导数字为 1,则设为 0 并将 1 附加到标记中的前导 ('1'00 -> 1'0'00) 数字中
  • 从数组后面开始,如果(第i个元素为1,置入0),则
  • 寻找下一个 0
  • 把0变成1
  • 把肯定是1的元素之间都变成0
  • 终止点很可能是错误的,我可以通过标志(在第 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 步中

如何调试我的算法并使其按预期运行?

【问题讨论】:

  • 这是Java代码吗?用所涉及的语言对其进行标记有助于获得正确的关注。
  • 是的。抱歉,刚刚修复

标签: java algorithm binary


【解决方案1】:

在二进制中,如果左移,则乘以 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)。向右移动有效地将数字除以基数并向下舍入。

【讨论】:

  • 好答案,我唯一要补充的是检查号码是否为"0",这样你就不会得到"00"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-05
  • 1970-01-01
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
  • 2016-07-25
相关资源
最近更新 更多