Les operateurs bit a bit
Résolu/Fermé
salahuiste
Messages postés
11
Date d'inscription
mardi 20 décembre 2016
Statut
Membre
Dernière intervention
15 avril 2017
-
20 déc. 2016 à 21:54
mamiemando Messages postés 32283 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 17 mars 2023 - 23 déc. 2016 à 11:19
mamiemando Messages postés 32283 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 17 mars 2023 - 23 déc. 2016 à 11:19
A voir également:
- Les operateurs bit a bit
- Telecharger winrar 64 bit gratuit - Télécharger - Compression & Décompression
- Poweriso 32 bit - Télécharger - Gravure
- Sticky bit - Forum Linux / Unix
- Bit torrent - Télécharger - Téléchargement & Transfert
- Format factory 32 bit windows 7 - Télécharger - Conversion & Codecs
1 réponse
mamiemando
Messages postés
32283
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
17 mars 2023
7 572
Modifié par mamiemando le 23/12/2016 à 11:20
Modifié par mamiemando le 23/12/2016 à 11:20
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