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;
}
A voir également:
- Les operateurs bit a bit
- Winrar 64 bit - Télécharger - Compression & Décompression
- Power iso 32 bit - Télécharger - Gravure
- Cle windows 10 professional 64 bit gratuit - Guide
- 32 bit - Guide
- Format factory 64 bit - Télécharger - Conversion & Codecs
1 réponse
Bonjour,
Pré-requis
Tout d'abord il faut savoir qu'en C, tout ce qui est différent de
Il faut déjà comprendre ce que fait chaque opérateur :
-
-
-
Sur le même principe tu as :
-
-
-
-
Ces primitives sont suffisantes pour travailler au niveau bit, là où les opérateurs autres (
Enfin dans les exemples que tu donnes il y a la syntaxe du test ternaire. C'est une manière d'écrire un
Exemple :
Utilisations classiques
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
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 de
- réciproqiement, remettre à 0 le i-ème bit de x : il faut appliquer sur x le et bit à bit le masque
- 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 :
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
Pré-requis
Tout d'abord il faut savoir qu'en C, tout ce qui est différent de
0(ou
NULL) est considéré comme vrai. Par exemple
7signifie vrai, de même que
0x123.
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 exemple
1101 & 0110est égal à
0100.
-
x &= ystocke dans x le résultat de
x & 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 un
if .. 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 classiques
1 << irevient à écrire en binaire 10000 (1 décalé 4 fois à gauche dans une case de la taille d'un entier, donc typiquement 32 bits), dit autrement
1 << iest é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 si
x & 1 << i == 0permet 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 de
0000010000ou 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 masque
111101111ou 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