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
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;
}


A voir également:

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
Bonjour,


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
7
signifie 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 & 0110
est égal à
0100
.
-
x &= y
stocke 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 << 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 autrement
1 << 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 si
x & 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 de
0000010000
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 masque
111101111
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
2