Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 5 sur 5
  1. #1
    Candidat au titre de Membre du Club
    Homme Profil pro
    Architecte réseau
    Inscrit en
    juillet 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte réseau
    Secteur : Arts - Culture

    Informations forums :
    Inscription : juillet 2012
    Messages : 23
    Points : 13
    Points
    13

    Par défaut int i |= 8 fonctionnement de pipe + egal

    Bonjour,

    Que veut dire l'enchainement de | avec = svp en C?

    Je comprends += ou encore /= etc... mais j'avoue que je suis perdu avec l'association de |=.

    Par exemple :

    Code :
    1
    2
    3
    4
    5
     
    int i;
     
    i |= 5;
    // valeur de i apres ? que s'est-il passe ?

    Je vous remercie d'avance

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    septembre 2007
    Messages
    5 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2007
    Messages : 5 387
    Points : 12 678
    Points
    12 678

    Par défaut

    Bonsoir,

    Le pipe « | » représente le OU logique bit à bit.

    « i |= 5 » est équivalent à « i = i | 5 », exactement sur le même modèle que les autres opérateurs. De la même façon, le ET logique s'écrit « i &= 5 » ou « i = i & 5 ».

    Les opérations ET ou OU sont celles de la logique du premier ordre. Dans les ordinateurs, elles nous intéressent parce qu'on peut les considérer comme les opérations les plus fondamentales : c'est avec des portes logiques ET, OU, NON et OU Exclusif que l'on forme les additionneurs-soustracteurs, par exemple.

    En programmation, elles sont particulièrement utiles parce que c'est avec elles que l'on va pouvoir travailler au niveau du bit, puisque le micro-processeur ne sait adresser que des mots binaires de taille fixe (généralement un octet).

    Il s'agit donc de comparer deux à deux chacun des bits de deux valeurs données (le bit0 avec le bit 0, le bit 1 avec le bit 1, et ainsi de suite), puis :

    — Dans une opération OU, le bit du résultat sera à 1 si le même bit d'au moins un des opérandes est à 1 (l'un OU l'autre, ou les deux a fortiori) ;
    — Dans une opération ET, le bit du résultat sera à 1 si les mêmes bits des deux opérandes sont à 1 (l'un ET l'autre) ;

    Un OU est donc l'équivalent d'une UNION, et un ET celui d'une INTERSECTION.

    Par conséquent, pour forcer à 1 un bit donné dans une variable, on fait un OU avec une valeur appelée « masque » dans laquelle ce bit est à 1. Pour forcer un bit à zéro, on fait un ET avec un autre masque. Tous les bits marqués à 1 dans le masque conserveront leur valeur initiale et les autres seront forcés à zéro.

  3. #3
    Membre chevronné
    Avatar de Kirilenko
    Homme Profil pro Lucas Pesenti
    Étudiant
    Inscrit en
    décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Nom : Homme Lucas Pesenti
    Âge : 17
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2011
    Messages : 234
    Points : 762
    Points
    762

    Par défaut

    Bonjour,

    Citation Envoyé par pierrot54700 Voir le message
    Bonjour,

    Que veut dire l'enchainement de | avec = svp en C?

    Je comprends += ou encore /= etc... mais j'avoue que je suis perdu avec l'association de |=.

    Par exemple :

    Code :
    1
    2
    3
    4
    5
     
    int i;
     
    i |= 5;
    // valeur de i apres ? que s'est-il passe ?
    La valeur de i est toujours aussi indéfinie. Blague à part, pour résumer la réponse de Obsidian, c'est comme un OU logique, mais sur tous les bits de i.

    Code :
    1
    2
    3
    4
    5
     
    int a = 0xde;   /* 1101 1110 */
    int b = 0x13;   /* 0001 0011 */
    int c = a | b;  /* 1101 1111 */
    printf("%#02x\n", c); /* 0xdf */
    Rappel de la table de vérité du OU inclusif :



    Bonne journée !
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  4. #4
    Modérateur
    Avatar de gangsoleil
    Profil pro
    R&D en systemes informatiques bas niveau Unix/Linux
    Inscrit en
    mai 2004
    Messages
    8 521
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : R&D en systemes informatiques bas niveau Unix/Linux

    Informations forums :
    Inscription : mai 2004
    Messages : 8 521
    Points : 21 746
    Points
    21 746

    Par défaut

    Citation Envoyé par pierrot54700 Voir le message
    Code :
    1
    2
    3
    4
    5
     
    int i;
     
    i |= 5;
    // valeur de i apres ? que s'est-il passe ?
    La reponse d'Obsidian est parfaite, a un detail pres : il ne t'explique pas ce que contient i dans ton code.
    Citation Envoyé par Obsidian Voir le message
    Tous les bits marqués à 1 dans le masque conserveront leur valeur initiale et les autres seront forcés à zéro.
    Tout ce que tu sais, c'est que tous les bits composants le nombre 5 seront a 1 dans i. Mais ce qui est plus drole, c'est que tu n'en sais pas plus, c'est a dire que dans ce cas, tu ne dois absolument pas manipuler i pour autre chose que pour des masques, et donc surtout pas faire des tests d'egalite.

    Pour les exemples, je n'ecris que les 8 bits les plus faibles (non signes), mais ca fonctionne sur 64 bits aussi hein.
    Exemple 1 : i est "initialisé" a 3 lors de l'execution
    Code C :
    1
    2
    3
    int i ; /* Contenu de i : 00000011 */
     
    i |= 5 ; /* Contenu de i : 00000011 | 00000101 = 00000111, c'est a dire 7 */

    Exemple 2, i initialise a 8 :
    Code C :
    1
    2
    3
    int i ; /* Contenu de i : 00001000 */
     
    i |= 5 ; /* Contenu de i : 00001000 | 00000101 = 00001101, c'est a dire 13 */
    Modérateur "C", "Informatique Générale & Hardware" et "Unix"
    Les règles du forum

  5. #5
    Candidat au titre de Membre du Club
    Homme Profil pro
    Architecte réseau
    Inscrit en
    juillet 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte réseau
    Secteur : Arts - Culture

    Informations forums :
    Inscription : juillet 2012
    Messages : 23
    Points : 13
    Points
    13

    Par défaut

    Merci a toutes et a tous pour vos excellentes reponses, tout aussi completes les unes que les autres.

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •