• [^] # Re: Plutôt beauté du design

    Posté par . En réponse au journal "beauté du code". Évalué à 3.

    Une astuce c'est un truc qui peut casser dès qu'on met à jour le compilateur et/ou le runtime ou dès qu'on change d'environnement.

    Non. Par exemple si je veux savoir si un nombre est une puissance de 2, je peux écrire

    _Bool
    is_power_of_2_naive(unsigned long n)
    {
     unsigned long remainder = 0;
     while (!remainder) {
     remainder = n % 2;
     n /= 2;
     }
     return remainder == 1 && n == 0;
    }

    Ça marche, c'est assez direct, et au pire j'aurai log_2 n itérations (puisque je divise par 2 à chaque itération).

    On peut quand même simplifier :

    _Bool
    is_power_of_2_naive(unsigned long n)
    {
     if (n == 0) return false;
     while (n%2 == 0) 
     n /= 2;
     return n == 1;
    }

    On peut même rendre l'écriture plus compacte :

    _Bool
    is_power_of_2_naive(unsigned long n)
    {
     if (n == 0) return false;
     for (; n%2 == 0; n /= 2) 
     ;
     return n == 1;
    }

    Mais bon jusque là, « l'astuce » c'est juste connaître le langage, et savoir exprimer la même chose de différentes façon. Il s'agit donc purement de style.

    Mais je peux être réellement astucieux, et répondre en temps constant :

    _Bool
    is_power_of_2(unsigned long n)
    {
     return (n > 0) && ((n & (n-1)) == 0);
    }

    Un entier non-signé ne changera jamais ses propriétés, donc j'ai la garantie que ce code fonctionnera toujours en C/C++ (et en fait n'importe quel langage qui permet les opérations bit-à-bit sur des entiers).