C — Licence 2 InformatiqueCertaines questions admettent plusieurs réponses possibles, tout aussi bonnes et efficaces.
1 << 14
~(1 << 13)
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.
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.
(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é.
(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.
(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.
((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 ==.
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.
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.
(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.