2016-04-17 19 views
0

Es funktioniert, wenn ich binäre wie 10, 1011, 1101 eingeben. Aber es druckt immer "Nicht binär", wenn ich 10011010010 eingeben, während es 1234 sein sollte. Wie ändert man es?Wie konvertiert man große binäre in dezimal?

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

einen besonderen Grund zu verwenden, wie einen gewundenen 'IsBinary()' Algorithmus? – shmosel

+0

Warum markieren Sie nicht die beste Antwort als [akzeptiert] (http://stackoverflow.com/help/accepted-answer)? Sie können dies tun, indem Sie auf das Häkchen neben der Antwort klicken. Dies wird Ihre Rep zu erhöhen. –

Antwort

0

Das Problem ist, dass Sie eine Nummer zu analysieren versuchen, die
Integer.MAX_VALUEwhich is 2^31 - 1 übersteigt:

int intNum = Integer.parseInt(binaryNum); 

Versuchen Long.parseLong stattdessen verwenden. A long hat 64 Bits und hat einen Bereich von -9,223,372,036,854,775,808 bis 9,223,372,036,854,775,807, was ausreichen sollte, um Ihre verschiedenen Eingänge abzudecken (obwohl dies natürlich bei längeren Zahlen nicht möglich ist).

+0

Es wird immer noch "Nicht binär" gedruckt, als ich 10011010010 eingegeben habe. – Andrew

+0

@Abschied Sie müssen 'isBinary()' ebenfalls aktualisieren. – shmosel

+0

Danke dir, es funktioniert jetzt. – Andrew

0

Dies funktioniert, obwohl es effizienter wäre, mehr als 1 Bit gleichzeitig zu verarbeiten. Ergebnis für 1000000000000000000000000000000000000000000000000000000000000000 ist 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!"); 
    } 
} 

Mehr Minimalversion mit der Verwendung von 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!"); 
    } 
} 
+0

vielen Dank – Andrew

+0

Warum BigDecimal? Und warum manuell in Dezimal konvertieren, wenn wir einen Konstruktor verwenden können, der ein Eingabe-Radix-Argument annimmt? –

+0

@ Snađошƒаӽ Ja. Ich kannte den BigInteger Radix-Konstruktor nicht - es ist perfekt. Ich habe BigDecimal verwendet, weil es 2 Uhr morgens ist und der Code sich bereits auf Dezimalstellen bezieht. schlechte Wahl. Ich würde die Antwort löschen, wenn ich nicht meine 'isBinary()' – Tibrogargan

1

Warum so viele Konvertierungen von String in int? Behalten Sie die Eingabe in Form einer Zeichenfolge bei, um zu überprüfen, ob die Eingabe binär ist oder nicht. Dann wandle die Zeichenfolge schließlich in den Zahlentyp um. Wenn Sie der Meinung sind, dass Ihre Eingabe den maximalen Wert von int nicht überschreitet, können Sie parseInt() verwenden, andernfalls verwenden Sie entweder long oder BigInteger.

Mit Eingabe als Zeichenfolge, Ihre isBinary() kann wie folgt aussehen:

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; 
} 

Dann wird Ihr alle Integer.parseInt() Anrufe long.parseLong() ändern, und die damit verbundenen Variablen entsprechend ändern, dh von int zu lang. Das sollte ausreichen, um das zu bekommen, was Sie erwarten. Was ich meine ist für beliebig große Eingaben, muss man BigInteger verwenden (siehe unten).


Wenn Sie java.math.BigInteger verwenden möchten, können Sie den Konstruktor mit dem Radix wie so verwenden:

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

@Andrew würde Ich denke, vielleicht Kombination von BigInteger von Snađoƒƒӽ und mein Muster wäre ein guter Weg, es zu tun. – Tibrogargan

Verwandte Themen