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.