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 ?

361voto

Matt Ball Points 165937

Vous devez spécifier le radix . Il y a une surcharge de Integer#parseInt() qui vous permet de.

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

25voto

Cela pourrait fonctionner :

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

14voto

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

fonctionne parfaitement si vous avez affaire à des nombres positifs, mais si vous avez besoin de traiter des nombres signés, vous devrez peut-être étendre le signe de votre chaîne puis la convertir en 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 

J'espère que cela vous aidera !

6voto

Rudy Duran Points 61
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;
}

3voto

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

Je crois que je m'ennuie encore plus ! Modification de la réponse de Hassan pour qu'elle fonctionne correctement.

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