webentwicklung-frage-antwort-db.com.de

So konvertieren Sie einen Binär-String in Java in eine 10-Ganzzahl

Ich habe ein Array von Strings, die Binärzahlen (ohne führende Nullen) darstellen, die ich in ihre entsprechenden Zahlen der Basis 10 konvertieren möchte. Erwägen:

binary 1011 becomes integer 11
binary 1001 becomes integer 9
binary   11 becomes integer 3   etc. 

Wie gehe ich am besten vor? Ich habe Java.lang.number. * Erforscht, ohne eine direkte Konvertierungsmethode zu finden. Integer.parseInt(b) ergibt eine ganze Zahl EQUAL für den String ... z. B. wird 1001 statt 9 ... 1.001 und scheint keinen Parameter für eine Ausgabebasis zu enthalten. toBinaryString führt die Konvertierung in die falsche Richtung. Ich vermute, dass ich eine mehrstufige Konvertierung durchführen muss, aber ich finde nicht die richtige Kombination von Methoden oder Unterklassen. Ich bin auch nicht sicher, inwieweit führende Nullen oder deren Fehlen ein Problem sein werden. Hat jemand eine gute Wegbeschreibung, um mich zu zeigen?

77
dwwilson66

Sie müssen die Basis angeben . Es gibt eine Überladung von Integer#parseInt(), die es Ihnen ermöglicht.

int foo = Integer.parseInt("1001", 2);
199
Matt Ball

Das könnte funktionieren:

public int binaryToInteger(String binary) {
    char[] numbers = binary.toCharArray();
    int result = 0;
    for(int i=numbers.length - 1; i>=0; i--)
        if(numbers[i]=='1')
            result += Math.pow(2, (numbers.length-i - 1));
    return result;
}
16
Hassan
int foo = Integer.parseInt("1001", 2);

funktioniert gut, wenn Sie mit positiven Zahlen zu tun haben, aber wenn Sie mit signierten Zahlen arbeiten müssen, müssen Sie die Zeichenfolge verlängern und dann in ein Int konvertieren

public class bit_fun {
    public static void main(String[] args) {
        int x= (int)Long.parseLong("FFFFFFFF", 16);
        System.out.println("x =" +x);       

        System.out.println(signExtend("1"));
        x= (int)Long.parseLong(signExtend("1"), 2);
        System.out.println("x =" +x);

        System.out.println(signExtend("0"));
        x= (int)Long.parseLong(signExtend("0"), 2);
        System.out.println("x =" +x);

        System.out.println(signExtend("1000"));
        x= (int)Long.parseLong(signExtend("1000"), 2);
        System.out.println("x =" +x);

        System.out.println(signExtend("01000"));
        x= (int)Long.parseLong(signExtend("01000"), 2);
        System.out.println("x =" +x);
    }

    private static String signExtend(String str){
        //TODO add bounds checking
        int n=32-str.length();
        char[] sign_ext = new char[n];
        Arrays.fill(sign_ext, str.charAt(0));

        return new String(sign_ext)+str;
    }
}

output:
x =-1
11111111111111111111111111111111
x =-1
00000000000000000000000000000000
x =0
11111111111111111111111111111000
x =-8
00000000000000000000000000001000
x =8 

Ich hoffe das hilft!

6
txcotrader
static int binaryToInt (String binary){
    char []cA = binary.toCharArray();
    int result = 0;
    for (int i = cA.length-1;i>=0;i--){
        //111 , length = 3, i = 2, 2^(3-3) + 2^(3-2)
        //                    0           1  
        if(cA[i]=='1') result+=Math.pow(2, cA.length-i-1);
    }
    return result;
}
5
Rudy Duran
public Integer binaryToInteger(String binary){
    char[] numbers = binary.toCharArray();
    Integer result = 0;
    int count = 0;
    for(int i=numbers.length-1;i>=0;i--){
         if(numbers[i]=='1')result+=(int)Math.pow(2, count);
         count++;
    }
    return result;
}

Ich denke, ich bin noch gelangweilt! Modifizierte Hassans Antwort, um korrekt zu funktionieren.

2

Wenn Sie sich Sorgen um die Leistung machen, sind Integer.parseInt() und Math.pow() zu teuer. Sie können die Bit-Manipulation verwenden, um dasselbe zweimal zu tun (basierend auf meiner Erfahrung):

final int num = 87;
String biStr = Integer.toBinaryString(num);

System.out.println(" Input Number: " + num + " toBinary "+ biStr);
int dec = binaryStringToDecimal(biStr);
System.out.println("Output Number: " + dec + " toBinary "+Integer.toBinaryString(dec));

Woher

int binaryStringToDecimal(String biString){
  int n = biString.length();      
  int decimal = 0;
  for (int d = 0; d < n; d++){
    // append a bit=0 (i.e. shift left) 
    decimal = decimal << 1;

    // if biStr[d] is 1, flip last added bit=0 to 1 
    if (biString.charAt(d) == '1'){
      decimal = decimal | 1; // e.g. dec = 110 | (00)1 = 111
    }
  }
  return decimal;
}

Ausgabe:

 Input Number: 87 toBinary 1010111
Output Number: 87 toBinary 1010111
0
anask

Version von Javas Integer.parseInt (Text) wurde korrigiert, um mit negativen Zahlen zu arbeiten:

public static int parseInt(String binary) {
    if (binary.length() < Integer.SIZE) return Integer.parseInt(binary, 2);

    int result = 0;
    byte[] bytes = binary.getBytes();

    for (int i = 0; i < bytes.length; i++) {
        if (bytes[i] == 49) {
            result = result | (1 << (bytes.length - 1 - i));
        }
    }

    return result;
}
0
skyrosbit

Für mich habe ich NumberFormatException erhalten, als ich versucht habe, mit den negativen Zahlen umzugehen. Ich habe das Folgende für die negativen und positiven Zahlen verwendet.

System.out.println(Integer.parseUnsignedInt("11111111111111111111111111110111", 2));      

Output : -9
0
Zeus