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.