Les operateurs bit a bit
Résolu
salut
j'ai pas compris les instructions suivantes , svp quelqu'un peut m'expliquer chaque instruction ce qu'il fait? merci d'avance
if (p>=0 && p<8 )
return ((c & (1<<p))?1:0)
___________________________
if (val==0) c&=~(1<<p);
else c|=(1<<p);
return c;
_______________________________________
char s;
int i ,tp[8]= {2,0,1,3,4,7,6,5};
for (i=0; i<8; i++)
s=sett(s,tp[i],gett(c,i));
return s;
}
j'ai pas compris les instructions suivantes , svp quelqu'un peut m'expliquer chaque instruction ce qu'il fait? merci d'avance
if (p>=0 && p<8 )
return ((c & (1<<p))?1:0)
___________________________
if (val==0) c&=~(1<<p);
else c|=(1<<p);
return c;
_______________________________________
char s;
int i ,tp[8]= {2,0,1,3,4,7,6,5};
for (i=0; i<8; i++)
s=sett(s,tp[i],gett(c,i));
return s;
}
1 réponse
-
Bonjour,
Pré-requis
Tout d'abord il faut savoir qu'en C, tout ce qui est différent de0
(ouNULL
) est considéré comme vrai. Par exemple7
signifie vrai, de même que0x123
.
Il faut déjà comprendre ce que fait chaque opérateur :
-&&
: et logique (retourne quelque chose de non nul les deux opérandes sont non nulles).
-&
: et bit à bit. Par exemple1101 & 0110
est égal à0100
.
-x &= y
stocke dans x le résultat dex & y
.
Sur le même principe tu as :
-||
et|
et|=
pour le ou logique.
-~
(complément bit à bit) et~=
.
-<<
et<<=
pour le décalage de bit à gauche (x << i signifie qu'on décale les bits de x de i crans vers la gauche. Tout ce qui sort "en dehors de la variable est "perdu". Tout ce qui apparaît dans la variable vaut 0).
->>
et>>=
pour le décalage de bit à droite
Ces primitives sont suffisantes pour travailler au niveau bit, là où les opérateurs autres (+
,-
,||
, etc...) ne permettait pas de travailler plus finement qu'au niveau de l'octet (byte).
Enfin dans les exemples que tu donnes il y a la syntaxe du test ternaire. C'est une manière d'écrire unif .. else ...
rapidement.
Exemple :#include <stdio.h> int main() { int x = 7; char * text = x % 2 == 0 ? "pair" : "impair"; printf("%d est %s\n", x, text); return 0; }
Utilisations classiques1 << i
revient à écrire en binaire 10000 (1 décalé 4 fois à gauche dans une case de la taille d'un entier, donc typiquement 32 bits), dit autrement1 << i
est égal à2^i
. Sauf que c'est beaucoup plus rapide à calculer que 2*2*...*2 (i fois). Évidemment cet "astuce" ne marche que pour les puissances de 2.
Si on voit 1 << i, c'est également un moyen pratique d'extraire le i-ème bit d'une valeur x. En effet, si le&
vaut 0 (respectivement 1), cela signifie que forcément, le i-ème bit de x valait 0 (respectivement 1). Ainsi, évaluer six & 1 << i == 0
permet de déterminer le statut du i-ème bit.#include <stdio.h> #include <stdbool.h> int main() { int x = 7; int i = 3; char * text = x & (1 << i) ? "actif" : "inactif"; printf("Le %d-ème bit de %d est %s\n", i, x, text); return 0; }
Partant de là, tu pourrais imaginer vouloir coder une fonction pour
- remettre à 1 le i-ème bit de x : il faut appliquer sur x le ou bit à bit de0000010000
ou 1 est le i-ème bit de, et où le masque fait la longueur de x.
- réciproqiement, remettre à 0 le i-ème bit de x : il faut appliquer sur x le et bit à bit le masque111101111
ou 0 est le i-ème bit de, et où le masque fait la longueur de x.
- etc...
Pour la remise à 0, la seule chose qu'on n'a pas vu, c'est comment généré tous ces 1. Si x est un int, il suffit de dire :int mask = ~0
Retour à ton exercice
Maintenant que tu as les bases, l'exercice devrait être une formalité.
- Le premier exercice on l'a déjà traité.
- Le second j'ai pour ainsi dire donner le réponse
- Le troisième utilise des fonctions sett et gett que tu n'as pas défini.
Bonne chance