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

tarek_dotzero Messages postés 817 Date d'inscription jeudi 19 juillet 2007 Statut Membre Dernière intervention 12 avril 2022 - 1 janv. 2017 à 13:39
tarek_dotzero Messages postés 817 Date d'inscription jeudi 19 juillet 2007 Statut Membre Dernière intervention 12 avril 2022 - 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.

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

tarek_dotzero Messages postés 817 Date d'inscription jeudi 19 juillet 2007 Statut Membre Dernière intervention 12 avril 2022
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.
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 127
Modifié par KX le 7/01/2017 à 10:24
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.
Rejoignez-nous