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.