Perfectionnement à la programmation en C — Licence 2 Informatique

HomeResearchTeaching

Exercice 1 du TP8

Certaines questions admettent plusieurs réponses possibles, tout aussi bonnes et efficaces.

  1. 1 << 14

  2. ~(1 << 13)

  3. x = x | (1 << 12);

    Explication : 1 << 12 est l’entier qui possède un 1 en position 12 et des 0 partout ailleurs. Le | associe les 0 de cet entier avec les bits de x sans les changer et associe le 1 de cet entier avec le bit en position 12 de x pour faire un bit à 1.

  4. x = x & (~(1 << 11));

    Explication : ~(1 << 11) est l’entier qui possède un 0 en position 11 et des 1 partout ailleurs. Le & associe les 1 de cet entier avec les bits de x sans les changer et associe le 0 de cet entier avec le bit en position 11 de x pour faire un bit à 0.

    Suggestion : écrire des fonctions

    void allumer_bit(int *x, int i);

    et

    void eteindre_bit(int *x, int i);

    qui, respectivement, positionnent à 1 ou à 0 le bit en position i de l’entier pointé par x.

  5. (x >> 10) & 1

    Explication : x >> 10 est l’entier dans lequel le bit en position 0 est le bit en position 10 de x. Si ce bit est 1, l’associer avec le & 1 donne une expression égale à 1 (considérée donc comme vraie). À l’inverse, si ce bit est 0, l’associer avec le & 0 donne une expression égale à 0 (considérée comme fausse).

    Suggestion : écrire une fonction

    int est_bit_allume(int x, int i);

    qui teste si le bit en position i de x est allumé.

  6. (x & 7) == 7

    Explication : 7 est l’entier qui possède des 0 partout, sauf en positions 0, 1 et 2. Ceci étant précisé, l’expression x & 7 a pour valeur l’entier qui possède des 0 partout, sauf en positions 0, 1 et 2. En ces positions, ce sont les bits de x qui sont conservés. On appelle dans ce contexte la valeur 7 masque d’extraction. Maintenant, il suffit de comparer l’extraction par rapport à 7 pour savoir si les trois premiers bits de x sont à 1.

  7. (x & 15) == 0

    Explication : en vertu de l’explication précédente, 15 est le bon masque d’extraction pour s’intéresser aux 4 premiers bits de x. Ils sont donc bien tous à 0 si l’entier x & 15 est à 0.

  8. ((x >> 9) & 1) == ((y >> 9) & 1)

    Explication : les sous-expressions (x >> 9) & 1 et (y >> 9) & 1 permettent respectivement d’extraire les bits en position 9 de x et de y et de les pousser tout à droite (voir la question 5.). Il suffit maintenant de les comparer par ==.

  9. x & y

    Explication : si x et y possèdent un bit à 1 en une même position, l’entier x & y possède ce bit à 1. Cette expression est donc non nulle, ce qui la compte pour vraie; À l’inverse, si x et y sont tels qu’il n’existe aucune position en laquelle les bits de x et y sont tous deux à 1, x & y contient uniquement des 0. Cette expression est donc nulle, ce qui la compte pour fausse.

  10. x == y

    Explication : si x et y sont tels qu’ils ont exactement chacun de leurs bits égaux en les mêmes positions, c’est qu’ils sont égaux, et réciproquement.

  11. (x ^ y) == ~0

    Explication : si en toute position chaque bit de x est différent de chaque bit de y, x ^ y est l’entier qui possède des 1 partout. Il est donc égal à ~0. À l’inverse, s’il existe au moins un position en laquelle les bits de x et de y sont égaux, x ^ y aura un bit à 0 en cette position. Sa comparaison dans ce cas avec ~0 sera fausse.