Java 如何将大二进制转换为十进制?

Java 如何将大二进制转换为十进制?,java,Java,当我输入二进制代码,比如101111101时,它就工作了。但当我输入10011010010时,它总是打印“非二进制”,而它应该是1234。如何修改它 import java.util.Scanner; public class Binary { public static int toDecimal(String b) { int decimal = Integer.parseInt(b,2); return decimal; }

当我输入二进制代码,比如101111101时,它就工作了。但当我输入10011010010时,它总是打印“非二进制”,而它应该是1234。如何修改它

import java.util.Scanner;
public class Binary {

    public static int toDecimal(String b) {     
        int decimal = Integer.parseInt(b,2);
        return decimal;
    }


    public static boolean isBinary(String b) {
        int inputNum = Integer.parseInt(b);

        while(inputNum != 0){
            if(inputNum % 10 > 1){
                return false;
            }
            inputNum = inputNum / 10;
        }
        return true;
    }

    public static void main(String[] args) {

        System.out.print("Enter binary: ");
        Scanner in = new Scanner(System.in);
        String binaryNum = in.next();

        try{
            int intNum = Integer.parseInt(binaryNum);

            boolean isBinary = isBinary(binaryNum);
            if(isBinary){
                int outputDecimal = toDecimal(binaryNum);
                System.out.println("\n"+ outputDecimal +" in decimal");
            }else{
                System.out.println("\n" + "Not binary!");
            }
        }catch(Exception e){
            System.out.println("\n" + "Not binary!");
        }
    }
}

问题是您试图解析的数字超过了
整数。最大值


试着改用。
long
有64位,范围为
-9223372036854775808
9223372036854775807
,这应该足以覆盖您的各种输入(尽管对于较长的数字显然会失败)。

问题是您试图解析的数字超过了
整数。最大值


试着改用。一个
long
有64位,其范围为
-9223372036854775808
9223372036854775807
,这应该足以覆盖您的各种输入(尽管对于较长的数字显然会失败)。

虽然一次处理超过1位会更有效,但这是可行的。10000000000000000000000000000000000000000000000000000000的结果是9223372036854775808

import java.util.regex.Pattern;
import java.math.BigDecimal;

...

public static BigDecimal toDecimal(String b) {     
    BigDecimal bd1 = new BigDecimal(b.charAt(0)=='1'?1:0);
    BigDecimal two = new BigDecimal(2);
    for (int i = 1; i<b.length(); i++) {
        bd1 = bd1.multiply(two);
        bd1 = bd1.add(new BigDecimal(b.charAt(i)=='1'?1:0));
    }
    return bd1;
}

public static boolean isBinary(String b) {
    return Pattern.compile("[01]+").matcher(b).matches();
}    

public static void main(String[] args) {
    System.out.print("Enter binary: ");
    Scanner in = new Scanner(System.in);
    String binaryNum = in.next();

    try{
        boolean isBinary = isBinary(binaryNum);
        if(isBinary){
            BigDecimal outputDecimal = toDecimal(binaryNum);
            System.out.println("\n"+ outputDecimal +" in decimal");
        }else{
            System.out.println("\n" + "Not binary!");
        }
    }catch(Exception e){
        System.out.println("\n" + "Not binary!");
    }
}

虽然一次处理超过1位会更有效,但这是可行的。10000000000000000000000000000000000000000000000000000000的结果是9223372036854775808

import java.util.regex.Pattern;
import java.math.BigDecimal;

...

public static BigDecimal toDecimal(String b) {     
    BigDecimal bd1 = new BigDecimal(b.charAt(0)=='1'?1:0);
    BigDecimal two = new BigDecimal(2);
    for (int i = 1; i<b.length(); i++) {
        bd1 = bd1.multiply(two);
        bd1 = bd1.add(new BigDecimal(b.charAt(i)=='1'?1:0));
    }
    return bd1;
}

public static boolean isBinary(String b) {
    return Pattern.compile("[01]+").matcher(b).matches();
}    

public static void main(String[] args) {
    System.out.print("Enter binary: ");
    Scanner in = new Scanner(System.in);
    String binaryNum = in.next();

    try{
        boolean isBinary = isBinary(binaryNum);
        if(isBinary){
            BigDecimal outputDecimal = toDecimal(binaryNum);
            System.out.println("\n"+ outputDecimal +" in decimal");
        }else{
            System.out.println("\n" + "Not binary!");
        }
    }catch(Exception e){
        System.out.println("\n" + "Not binary!");
    }
}

为什么有这么多从字符串到int的转换?以字符串形式保存输入,以检查输入是否为二进制。最后将字符串转换为数字类型。如果您认为输入不会超过最大int值,可以使用
parseInt()
,否则可以使用
long
biginger

输入为字符串时,您的
isBinary()
可能如下所示:

public static boolean isBinary(String b) {
    for(int i=0; i<b.length(); i++) {
        if(b.charAt(i) != '0' && b.charAt(i) != '1') {
            return false;
        }
    }
    return true;
}

为什么有这么多从字符串到int的转换?以字符串形式保存输入,以检查输入是否为二进制。最后将字符串转换为数字类型。如果您认为输入不会超过最大int值,可以使用
parseInt()
,否则可以使用
long
biginger

输入为字符串时,您的
isBinary()
可能如下所示:

public static boolean isBinary(String b) {
    for(int i=0; i<b.length(); i++) {
        if(b.charAt(i) != '0' && b.charAt(i) != '1') {
            return false;
        }
    }
    return true;
}

当我输入10011010010时,它仍然打印“非二进制”。当我输入10011010010时,它仍然打印“非二进制”。使用这种复杂的
isBinary()
算法有什么特别的原因吗?为什么不将最佳答案标记为?您可以通过单击答案旁边的空心勾号来完成此操作。这也会增加你的重复率。使用这种复杂的
isBinary()
算法有什么特别的原因吗?为什么不将最佳答案标记为?您可以通过单击答案旁边的空心勾号来完成此操作。这也会增加你的声望。@Andrew我想也许将Sааааааааааа的大整数和我的模式结合起来会是一个好方法。@Andrew我想也许将Sааааааааа?既然我们可以使用接受输入基数参数的构造函数,为什么还要手动转换为十进制呢?@Sааааааӽ是的。我不知道BigInteger基数构造函数-它很完美。我使用了BigDecimal,因为它是凌晨2点,代码已经提到了小数。糟糕的选择。如果我不喜欢我的
isBinary()
为什么选择BigDecimal,我会删除答案?既然我们可以使用接受输入基数参数的构造函数,为什么还要手动转换为十进制呢?@Sааааааӽ是的。我不知道BigInteger基数构造函数-它很完美。我使用了BigDecimal,因为它是凌晨2点,代码已经提到了小数。糟糕的选择。如果我不喜欢我的
isBinary()
public static BigInteger toDecimal(String b) {
    return new BigInteger(b, 2);
}