146 votes

Comment convertir une chaîne binaire en un entier de base 10 en Java ?

J'ai un tableau de chaînes de caractères qui représentent des nombres binaires (sans zéros initiaux) que je veux convertir en leurs nombres correspondants en base 10. Considérons :

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

Quelle est la meilleure façon de procéder ? J'ai exploré java.lang.number.* sans trouver de méthode de conversion directe. Integer.parseInt(b) produit un nombre entier ÉGAL à la chaîne... par exemple, 1001 devient 1 001 au lieu de 9... et ne semble pas inclure de paramètre pour une base de sortie. toBinaryString effectue la conversion dans le mauvais sens. Je pense que je vais devoir effectuer une conversion en plusieurs étapes, mais je n'arrive pas à trouver la bonne combinaison de méthodes ou de sous-classes. Je ne sais pas non plus dans quelle mesure les zéros initiaux ou l'absence de zéros initiaux seront un problème. Quelqu'un a-t-il une bonne direction à me donner ?

3voto

L'utilisation de bitshift est plus élégante et plus rapide que celle de Math.pow . Il suffit de décaler les chiffres (0 ou 1) en position avec val <<= 1

// parse an unsigned binary string, valid up to 31 bits
static int binaryToBase10(String binaryString) {
    int val = 0;
    for (char c : binaryString.toCharArray()) {
        val <<= 1;
        val += c-'0';
    }
    return val;
}

Exemple d'utilisation

int val = binaryToBase10("1011");
System.out.println(val);

empreintes 11

2voto

Zeus Points 1643

Pour ma part, j'ai obtenu une NumberFormatException lorsque j'ai essayé de traiter les nombres négatifs. J'ai utilisé ce qui suit pour les nombres négatifs et positifs.

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

Output : -9

0voto

bjb568 Points 4288

J'adore les boucles ! Yay !

String myString = "1001001"; //73

Boucle While avec accumulateur, de gauche à droite ( l ne change pas) :

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

De droite à gauche avec 2 vars en boucle, inspiré par Convertir un booléen en int en Java (absolument horrible) :

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;

Une mise en œuvre un peu plus raisonnable :

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

Une version lisible :p

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

0voto

skyrosbit Points 1

Correction de la version de java Integer.parseInt(text) pour qu'elle fonctionne avec les nombres négatifs :

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

0voto

Kooin-Shin Points 26

Vous voulez maintenant passer d'une chaîne binaire à une chaîne décimale, mais après coup, vous aurez peut-être besoin d'une méthode contraire. Elle se trouve ci-dessous.

public static String decimalToBinaryString(int value) {
    String str = "";
    while(value > 0) {
        if(value % 2 == 1) {
            str = "1"+str;
        } else {
            str = "0"+str;
        }
        value /= 2;
    }
    return str;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X