java二进制到十进制

时间:2014-03-26 17:37:58

标签: java binary

我无法将二进制转换为小数。我们必须使用一个函数进行转换,而不是使用预定义的函数。这是我到目前为止,我知道这是一个烂摊子,但我仍然坚持如何解决它。谢谢!

import java.util.Scanner;

public class BinaryConversion {

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);

    String inString;
    int decimal;

    System.out.println("Enter a binary number: ");
    inString = input.nextLine();

    while (!"-1".equals(inString)) {
        int i;
        int binaryLength;

        binaryLength = inString.length();
public static int binaryToDecimal (String binaryString) {

    for (i = binaryLength - 1, decimal = 0; i >= 0; i--) {
        if (inString.charAt(i) == '1')
            decimal = decimal + Math.pow(2,inString.length() - 1 - i);
    }
    return (int) decimal;
}
        System.out.println(decimal);

        System.out.println("Enter a binary number: ");
        inString = input.nextLine();
    }
    System.out.println("All set !");
}
}

4 个答案:

答案 0 :(得分:2)

要使用函数,如您的分配所需,您必须在main方法中编写外部函数,然后包含调用函数的语句。所以将高于的行移到<{1}}:

public static void main

此外,每个函数或方法(包括public static int binaryToDecimal (String binaryString) { for (i = binaryLength - 1, decimal = 0; i >= 0; i--) { if (inString.charAt(i) == '1') decimal = decimal + Math.pow(2,inString.length() - 1 - i); } return (int) decimal; } )都有自己的变量,称为 local 变量;但每个函数使用的局部变量是它自己的独立副本。因此,上述功能将无法使用属于main的{​​{1}}或binaryLength变量。您需要在decimal

中声明它们
main

此外,此函数将无法访问binaryToDecimal的{​​{1}},但您的想法是您已为函数提供了您要使用的字符串,它指的是为public static int binaryToDecimal (String binaryString) { int decimal; int binaryLength; for (i = binaryLength - 1, decimal = 0; i >= 0; i--) { if (inString.charAt(i) == '1') decimal = decimal + Math.pow(2,inString.length() - 1 - i); } return (int) decimal; } 。因此,请在函数中将main更改为inString

binaryString

另请注意,inStringbinaryString变量与public static int binaryToDecimal (String binaryString) { int decimal; int binaryLength; for (i = binaryLength - 1, decimal = 0; i >= 0; i--) { if (binaryString.charAt(i) == '1') decimal = decimal + Math.pow(2,binaryString.length() - 1 - i); } return (int) decimal; } 中同名变量完全无关。这意味着,当您在binaryLength中分配decimal时,这对main中的binaryLength无效。您需要在函数中分配它。将main更改为

binaryLength

最后,为了使用该功能,binaryToDecimal将需要调用它。把它放在int binaryLength;函数:

int binaryLength = binaryString.length();

main执行该操作时,它会调用该函数并告诉它与main一起使用。但是,该函数将调用decimal = binaryToDecimal(inString); 。该函数将返回一个结果,然后main会将该结果分配给变量inString - 这意味着属于binaryString的局部变量main,因为上述声明在decimal内。

我不知道这是否会让你的整个程序运作起来。 (它应该,但我不确定。)但我只想解释如何使用函数的细节。

答案 1 :(得分:1)

令人困惑的部分是Math.pow及其复杂的论点,很容易发生一对一的错误。

然而,如果我们在10号基数有一个数字,比如

123

它的值是

(((0×10)+1)* 10 + 2)×10 + 3

这看起来很复杂,但请注意简单的模式:从0开始,我们遍历数字。只要我们有另一个dgit,我们将前一个结果乘以基数并添加数字值。这就是全部!没有Math.pow,没有复杂的索引计算。

因此:

String s = "1010";
int value = 0;
int base = 2;
for (i=0; i < s.length(); s++) {
    char c = s.charAt(i);
    value = value * base;
    value = value + c - '0';
}

答案 2 :(得分:0)

当我清理你的代码时,它工作得很好 -

public static int binaryToDecimal(String binaryString) {
    int binaryLength = binaryString.length();
    int decimal = 0;
    for (int i = binaryLength - 1; i >= 0; i--) {
        if (binaryString.charAt(i) == '1') {
            decimal += Math.pow(2, binaryLength - 1 - i);
        }
    }
    return decimal;
}

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    System.out.println("Enter a binary number: ");
    String inString = input.nextLine();

    while (!"-1".equals(inString)) {
        System.out.println(binaryToDecimal(inString));

        System.out.println("Enter a binary number: ");
        inString = input.nextLine();
    }
    System.out.println("All set !");
}

输出

Enter a binary number: 
01
1
Enter a binary number: 
10
2
Enter a binary number: 
-1
All set !

答案 3 :(得分:0)

这里有一点点清理后的功能。

        public static int binaryToDecimal (String binaryString) {
            int decimal = 0;
            int base    = 2;
            for (int i = binaryString.length() - 1; i >= 0; i--) {
                if (binaryString.charAt(i) == '1')
                    decimal += Math.pow(base,i);
            }
            return decimal;
        }