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 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 23 déc. 2016 à 11:19
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 23 déc. 2016 à 11:19
A voir également:
- Les operateurs bit a bit
- Poweriso 32 bit - Télécharger - Gravure
- Winrar 64 bit windows 10 - Télécharger - Compression & Décompression
- Format factory 64 bit - Télécharger - Conversion & Codecs
- Cle windows 10 pro 64 bit gratuit - Guide
- Realtek audio driver windows 10 64-bit - Télécharger - Pilotes & Matériel
1 réponse
mamiemando
Messages postés
33079
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
23 avril 2024
7 749
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