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

时间:2016-04-17 08:12:03

标签: java

当我输入像10,1011,1101这样的二进制文件时,它可以正常工作。但是它总是打印"不是二进制"当我输入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!");
        }
    }
}

3 个答案:

答案 0 :(得分:1)

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

输入为字符串时,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;
}

然后将所有Integer.parseInt()调用更改为long.parseLong(),并相应地更改关联的变量,即从int更改为long。到目前为止,这应该足以满足您的期望。我的意思是对于任意大的输入,你必须使用BigInteger(见下文)。

如果您选择使用java.math.BigInteger,您可以使用带有基数的构造函数,如下所示:

public static BigInteger toDecimal(String b) {
    return new BigInteger(b, 2);
}

答案 1 :(得分:0)

问题是您正在尝试解析超过
的数字  Integer.MAX_VALUE which is 2^31 - 1

int intNum = Integer.parseInt(binaryNum);

请尝试使用Long.parseLonglong有64位且范围为-9,223,372,036,854,775,8089,223,372,036,854,775,807,这应该足以覆盖您的各种输入(尽管显然对于更长的数字会失败)。

答案 2 :(得分:0)

虽然一次处理多于1位的效率会更高,但仍然有效。结果为10000000000000000000000000000000000000000000000000000000000000是9,223,372,036,854,775,808

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!");
    }
}

使用BigInteger的更多最小版本

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

    try{
        if(Pattern.compile("[01]+").matcher(binaryNum).matches()){
            BigInteger outputDecimal = new BigInteger(binaryNum, 2);
            System.out.println("\n"+ outputDecimal +" in decimal");
        }else{
            System.out.println("\n" + "Not binary!");
        }
    }catch(Exception e){
        System.out.println("\n" + "Not binary!");
    }
}