Come convertire una stringa binaria in un intero in base 10 in Java


108

Ho un array di stringhe che rappresentano i numeri binari (senza zeri iniziali) che voglio convertire nei loro numeri di base 10 corrispondenti. Tener conto di:

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

Qual è il modo migliore per procedere? Ho esplorato java.lang.number. * Senza trovare un metodo di conversione diretta. Integer.parseInt(b)restituisce un numero intero UGUALE alla stringa ... ad esempio, 1001 diventa 1,001 invece di 9 ... e non sembra includere un parametro per una base di output. toBinaryStringfa la conversione nella direzione sbagliata. Sospetto di dover eseguire una conversione in più fasi, ma non riesco a trovare la giusta combinazione di metodi o sottoclassi. Inoltre, non sono sicuro della misura in cui gli zeri iniziali o la loro mancanza saranno un problema. Qualcuno ha buone indicazioni per indicarmi?



Risposte:


264

Devi specificare il file radix . C'è un sovraccarico Integer#parseInt()che ti permette di farlo.

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

1
Perfezione. Ho completamente perso la seconda riga nella documentazione di parseInt che consente il file radix. Funziona come un sogno.
dwwilson66

1
Funziona anche con gli zeri iniziali? Sto solo confermando, anche se non vedo motivo per cui no.
Siddhartha

@NagabhushanBaddi esempio? Stai passando una rappresentazione in complemento a due?
Matt Ball il

18

Questo potrebbe funzionare:

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

Suppongo che sia un po 'inutile. Ecco cosa succede quando hai un po 'di tempo tra le lezioni.
Hassan

6
questo è utile per me perché devo fare un progetto scolastico con conversioni senza usare quelle che java ha già
bucksnort2

Qualcuno l'ha testato prima? qui number.length meno l'indice più 1 è stato moltiplicato per 2, se non vado errato con bynary inizi con 1 e moltiplica quel valore per 2, quindi prendi il risultato e moltiplica quello uno per 2 che sarà il tuo 3 posto e così il
Christopher Cabezudo Rodriguez

(LA CASELLA DEI COMMENTI NON È BUONO PER SNIPPETS) Qui il codice che sto usando base nel tuo (mi ero perso e uso il tuo come modello) public static int binaryToInteger (String binary) {char [] numbers = binary.ToCharArray (); int risultato = 0; int posValue = 1; for (int i = numbers.Length - 1; i> = 0; i--) {if (numbers [i] == '1') {result + = posValue; } posValue * = 2; } risultato di ritorno; }
Christopher Cabezudo Rodriguez

1
Questo frammento di codice non funziona. forloop e il calcolo della nuova resultvariabile non è corretto.
trylimits

8
int foo = Integer.parseInt("1001", 2);

funziona bene se hai a che fare con numeri positivi ma se hai bisogno di trattare con numeri firmati potresti aver bisogno di firmare estendi la tua stringa quindi convertila in un Int

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 

Spero che aiuti!


1
Avevo bisogno di -1 convertito da binario a decimale, l'ho fatto. System.out.println ((int) Long.parseLong ( "11111111111111111111111111111111", 2));
Zeus

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

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

Immagino di essere ancora più annoiato! Risposta di Hassan modificata per funzionare correttamente.


1

Per me ho ricevuto NumberFormatException quando ho provato a gestire i numeri negativi. Ho usato quanto segue per i numeri negativi e positivi.

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

Output : -9

0

Corretta la versione di Integer.parseInt (testo) di java per lavorare con numeri negativi:

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

Adoro i loop! Sìì!

String myString = "1001001"; //73

While loop con accumulatore, da sinistra a destra ( lnon cambia):

int n = 0,
    j = -1,
    l = myString.length();
while (++j < l) n = (n << 1) + (myString.charAt(j) == '0' ? 0 : 1);
return n;

Da destra a sinistra con 2 variabili di ciclo, ispirate a Convert boolean to int in Java (assolutamente orribile):

int n = 0,
    j = myString.length,
    i = 1;
while (j-- != 0) n -= (i = i << 1) * new Boolean(myString.charAt(j) == '0').compareTo(true);
return n >> 1;

Un'implementazione un po 'più ragionevole:

int n = 0,
    j = myString.length(),
    i = 1;
while (j-- != 0) n += (i = i << 1) * (myString.charAt(j) == '0' ? 0 : 1);
return n >> 1;

Una versione leggibile: p

int n = 0;
for (int j = 0; j < myString.length(); j++) {
    n *= 2;
    n += myString.charAt(j) == '0' ? 0 : 1;
}
return n;

0

Se sei preoccupato per le prestazioni Integer.parseInt()e Math.pow()sei troppo costoso. Puoi usare la manipolazione dei bit per fare la stessa cosa due volte più velocemente (in base alla mia esperienza):

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

Dove

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

Produzione:

 Input Number: 87 toBinary 1010111
Output Number: 87 toBinary 1010111
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.