我正在尝试将二进制数字转换为十进制数字,但我的输出始终为0

时间:2019-02-22 20:07:36

标签: java binary

这是我的代码。我尝试将二进制转换为Char数组,然后将数组中的每个char乘以2到数组中其对应数字的幂,然后将char数组的所有值加总为一个double。编程新手,所以有些困惑。我的输入Binary是txfBinaryInput,我的输出标签是lblDisplay。

 private void btnProcessActionPerformed(java.awt.event.ActionEvent evt)                                           
{                                               
    if (txfBinaryInput.getText().equals(""))
    {
        lblDisplay.setText("ERROR: NO INPUT");
    } else
    {
        int n = 0;
        int[] binaryValueStorage = new int[100];
        double[] decimalValueStorage = new double[100];
        String binaryInput = txfBinaryInput.getText();
        int binaryNumber = binaryInput.length();
        char[] binaryDigits = binaryInput.toCharArray();
        for (int i = 0; i >= binaryNumber; i++)

        {
            binaryValueStorage[n] = binaryDigits[n];
            decimalValueStorage[n] = binaryValueStorage[n] * (Math.pow(2, n));
            n++;
        }
        double sum = 0;
        for (double a : decimalValueStorage)
        {
            sum += a;
        }
        lblDisplay.setText("The Deciaml Value Is " + sum);
    }
}                                          

2 个答案:

答案 0 :(得分:2)

当心:在for循环条件下,您拥有i >= binaryNumber而不是i < binaryNumber,因此您的程序将永远不会进入循环!

另一方面,为什么出于相同的目的(递增和访问数组)使用两个变量in

编辑:另一个问题:

在二进制数中,低阶位在右边,但是在数组中,索引是从左到右

因此,您希望您最右边的数字乘以2 ^ 0,其右下一个数字乘以2 ^ 1,依此类推。

但是在您的代码中,情况恰好相反:它是最左边的数字(您在索引0处的数字)乘以2 ^ 0!

要修复,您可以:

1)反转开始转换之前的binaryDigits数组,并保持其余代码不变

2)将decimalValueStorage[n] = binaryValueStorage[n] * (Math.pow(2, n));替换为decimalValueStorage[n] = binaryValueStorage[n] * (Math.pow(2, binaryNumber - n));

希望这会有所帮助!

答案 1 :(得分:0)

好吧,这有很多事情要问您,但这就是我要解决的问题:

public class BinaryToDecimalTest {

    private static long binaryToDecimal(String binaryInput)
    {
        long sum = 0;
        for (int i = 0 ; i < binaryInput.length() ; i++) {
            sum *= 2;
            if (binaryInput.charAt(i) == '1')
                sum += 1;
        }
        return sum;
    }

    private static void test(String binaryInput) {
        long n = binaryToDecimal(binaryInput);
        System.out.println(String.format("The Deciaml Value of %s Is %d", binaryInput, n));
    }

    public static void main(String...args) {
        test("0100");
        test("1011");
        test("1011");
        test("10000000");
        test("10000000000000000");
    }
}

结果:

The Deciaml Value of 0100 Is 4
The Deciaml Value of 1011 Is 11
The Deciaml Value of 1010 Is 10
The Deciaml Value of 10000000 Is 128
The Deciaml Value of 10000000000000000 Is 65536

我不想仅仅打扰您代码,但是鉴于您的代码存在所有问题,我不知道从哪里开始。我希望您看到您经常可以直接解决问题的方式。我很乐意继续与您合作,并解释这里发生的事情。

我正在使用的一个肮脏技巧是每次将整个累加总和乘以2。这使您可以从阵列的前端自然地工作,而不必倒退。第一个数字乘以2(长度-1)倍,第二个数字(长度-2),依此类推,直到最后一个数字,根本不乘。