Précédent   Forum du club des développeurs et IT Pro > C et C++ > C > Débuter
Débuter Forum d'entraide pour débuter en langage C. Avant de poster -> FAQ C
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 24/02/2013, 20h36   #1
pierrot54700
Candidat au titre de Membre du Club
 
Homme
Architecte réseau
Inscription : juillet 2012
Messages : 16
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 : 16
Points : 12
Points : 12
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
pierrot54700 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2013, 23h00   #2
Obsidian
Modérateur
 
Avatar de Obsidian
 
Homme
Chercheur d'emploi
Inscription : septembre 2007
Messages : 4 614
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Essonne (Île de France)

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

Informations forums :
Inscription : septembre 2007
Messages : 4 614
Points : 11 089
Points : 11 089
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.
Obsidian est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 25/02/2013, 13h32   #3
Kirilenko
Membre émérite
 
Avatar de Kirilenko
 
Homme Lucas Pesenti
Étudiant
Inscription : décembre 2011
Messages : 234
Détails du profil
Informations personnelles :
Nom : Homme Lucas Pesenti
Âge : 16
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 : 858
Points : 858
Envoyer un message via MSN à Kirilenko
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
Kirilenko est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 26/02/2013, 08h50   #4
gangsoleil
Modérateur
 
Avatar de gangsoleil
 
R&D en systemes informatiques bas niveau Unix/Linux
Inscription : mai 2004
Messages : 7 191
Détails du profil
Informations personnelles :
Âge : 32
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 : 7 191
Points : 18 081
Points : 18 081
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
gangsoleil est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 26/02/2013, 13h02   #5
pierrot54700
Candidat au titre de Membre du Club
 
Homme
Architecte réseau
Inscription : juillet 2012
Messages : 16
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 : 16
Points : 12
Points : 12
Merci a toutes et a tous pour vos excellentes reponses, tout aussi completes les unes que les autres.
pierrot54700 est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 04h06.


 
 
 
 
Partenaires

Hébergement Web