Les operateurs bit a bit

Résolu
salahuiste Messages postés 12 Statut Membre -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
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;
}

1 réponse

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     
    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