Conversion bas X (X <= 16) vers le binaire

tarek_dotzero 742 Messages postés jeudi 19 juillet 2007Date d'inscription 7 avril 2018 Dernière intervention - 1 janv. 2017 à 13:39 - Dernière réponse : tarek_dotzero 742 Messages postés jeudi 19 juillet 2007Date d'inscription 7 avril 2018 Dernière intervention
- 26 janv. 2017 à 02:01
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

http://codes-sources.commentcamarche.net/source/101794-conversion-bas-x-x-16-vers-le-binaire

Afficher la suite 
KX 15366 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 22 avril 2018 Dernière intervention - 7 janv. 2017 à 10:21
Bonjour,

Beaucoup de chose à revoir dans ton code, "destiné au débutant" selon toi, mais surtout, fait par un débutant...

Tout d'abord, c'est bizarre de dire que tu convertis ton nombre en décimal, alors que tu renvoies un int, qui est en binaire.
Fondamentalement ce que tu calcules, ce n'est ni du décimal, ni du binaire, c'est juste la valeur du nombre (sans notion de base), la seule notion de base est dans l'entrée, pas dans la sortie.

Sinon je trouve ta boucle while particulièrement inefficace. Tu itères sur chaque valeur du tableau (jusqu'à 16 fois) alors que l'on pourrait calculer cette valeur à l'aide la conversion int-char des caractères.

Enfin, ton calcul de puissance est inutile, tu peux faire ton calcul différemment.
Si tu as '2345' ce que tu fais c'est calculer d'abord 345 et tu rajoutes 2*10^3
Or en lisant tes caractères dans l'ordre, tu pourrais avoir calculé 234 et multiplier par 10 et ajouter 5, tu n'as donc plus besoin de ta puissance.

Remarque : tu travailles sur des int, dont la taille est limitée, il serait donc intéressant de vérifier que ton calcul est correct.

public static int parse(String nbr, int base) {
    if (nbr == null || nbr.isEmpty())
        throw new IllegalArgumentException("Le String est vide");
    if (base < 0 || base > 36)
        throw new IllegalArgumentException("La base est incorrecte : " + base);

    int resultat = 0;

    for (int i = 0, n = nbr.length(); i != n; i++) {
        char c = nbr.charAt(i);

        int position;
        if (c < '0' || c > 'Z') {
            throw new NumberFormatException("caractère incorrect : " + i);
        } else if (c <= '9') { // entre '0' et '9' inclus
            position = c - '0';
        } else if (c < 'A') { // entre '9' et 'A' exclus
            throw new NumberFormatException("caractère incorrect : " + i);
        } else { // entre 'A' et 'Z' inclus
            position = 10 + c - 'A';
        }
        if (position >= base)
            throw new NumberFormatException("caractère incorrect : " + i);

        int precedent = resultat;
        resultat = base * resultat + position;
        if (resultat / base != precedent)
            throw new ArithmeticException("la valeur est trop grande pour être un int");
    }

    return resultat;
}

Remarque : avec ce code tu peux aller jusqu'à la base 36 puisque tu peux utiliser tout l'alphabet.
tarek_dotzero 742 Messages postés jeudi 19 juillet 2007Date d'inscription 7 avril 2018 Dernière intervention > KX 15366 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 22 avril 2018 Dernière intervention - 26 janv. 2017 à 02:01
Bonjour,

Merci pour les remarques, surtout concernant la puissance.
Je veux juste clarifier un ou deux point.

Premièrement, il est évident que tout est en binaire, mais un appel l'affichage simple à l'écran (sans formatter) est en décimal.

Deuxièmement, j'ai aimé garder les 16 symboles, tout comme présenté dans les cours sur les systèmes de numération, et éviter de faire des conversion int-char ou bien de faire des calculs arithmétique sur les char.
Commenter la réponse de tarek_dotzero

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.