IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

int i |= 8 fonctionnement de pipe + egal


Sujet :

C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Juillet 2012
    Messages
    26
    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 : 26
    Points : 28
    Points
    28
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 360
    Points : 23 600
    Points
    23 600
    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 éclairé
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Points : 807
    Points
    807
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 148
    Points : 28 113
    Points
    28 113
    Par défaut
    Citation Envoyé par pierrot54700 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int i ; /* Contenu de i : 00001000 */
     
    i |= 5 ; /* Contenu de i : 00001000 | 00000101 = 00001101, c'est a dire 13 */
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Juillet 2012
    Messages
    26
    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 : 26
    Points : 28
    Points
    28
    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.

Discussions similaires

  1. [ZF 1.10] Clause where qui fonctionne avec type int mais pas avec type String
    Par shadypierre dans le forum Zend_Db
    Réponses: 5
    Dernier message: 30/04/2010, 14h00
  2. Réponses: 2
    Dernier message: 23/02/2009, 12h04
  3. [NASM] Int 21h qui ne fonctionne pas sur mon mini OS
    Par andromeda dans le forum Assembleur
    Réponses: 4
    Dernier message: 07/04/2007, 19h03
  4. [IPC: anonymous pipe] fonctionnement
    Par ZaaN dans le forum MFC
    Réponses: 4
    Dernier message: 30/01/2007, 09h29
  5. * du SQL pour un INT ? % ne fonctionne pas...
    Par Allen dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 26/04/2006, 12h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo