Les Allergies
Alimentaires
Posez votre question Signaler

Operateurs |= &= ~ en langage C [Résolu]

cyrard - Dernière réponse le 25 févr. 2010 à 09:05
Bonjour,
Voila je fais la retro-ingenierie des sources de openssl CMS et n'etant pas tres experimente en C je ne comprend pas les operateurs suivants:
|=
&=
~
dans le contexte suivant:

int flags=CMS_DETACHED;
[...]
flags &= ~CMS_DETACHED;
[...]
flags |= CMS_BINARY;

Dans les tutos de langage C sur le net on ne parle pas de ces operateurs.
Pourraient ils etre definis dans les lignes de commandes du precompilateur dans un fichier .h quelconque de l'application.
Merci
Lire la suite 

Operateurs |= &= ~ en langage C »

11 réponses
Réponse
+8
moins plus
a |= b; est équivalent à : a = a|b; => le "ou" binaire
Exemple avec a = 10 (00001010 en binaire) et b = 6 (00000110 en binaire)
après a|=b, a contiendra 14 (00001110 en binaire)

a&=b est équivalent à a=a&b; => le "et" binaire
pour reprendre mon exemple : après a&=b; a contiendra 2 (00000010 en binaire)

la vague ~ est, si je me souviens bien, le complémentaire.
Ajouter un commentaire
Réponse
+1
moins plus
Je crois que j'ai compris le principe.
En fait la variable flags est construite pour que lorsqu'on lui applique un & bit a bit avec une certaine valeur le resultat soit 0 ou 1 de maniere a ce que dans le programme on l'utilise de la facon suivante:

if(flags & CMS_DETACHED)

etc...

ca renvoie un booleen pour pouvoir utiliser le if.
Il faut que j'etudie ca plus en details mais j'ai compris l'idee.

En tous cas merci beaucoup a tous les trois pour vos reponses rapides et lumineuses!
ikoria - 25 févr. 2010 à 09:05
Ce genres d'opérateurs sont très utilisés dans le C orienté embarqué, c'est à dire sur micro-contrôleur,
pour le développement de drivers.

exemple:
on souhaite piloter des leds sur le PORTB d'un µC. (Je passe outre la déclaration du registre du port...)

PORTB&=~(1<<PB0);
_delay_ms(25);
PORTB&=~(1<<PB1);
_delay_ms(25);
PORTB&=~(1<<PB2);
_delay_ms(25);
PORTB&=~(1<<PB3);
_delay_ms(25);
PORTB|=(1<<PB3);
_delay_ms(75);
PORTB|=(1<<PB2);
_delay_ms(75);
PORTB|=(1<<PB1);
_delay_ms(75);
PORTB|=(1<<PB0);

Les diodes 0 à 3 vont s'allumer successivement puis s'éteindre.

Avec les explication au dessu, cela devrait être clair :)
Ajouter un commentaire
Réponse
+0
moins plus
Ah oui merci je vois, ce sont les operateur daffectation mais a quoi cela peut il servir de faire de OU bit a bit sur un entier (entre en Hexadecimal dans le code) qui est une option (binaire, message signe ou non...) propre a lapplication.

#define CMS_BINARY 0x80 ( ca cest dans le fichier .h)

Ensuite dans lapplication:
int flags=CMS_DETACHED;
flags|=CMS_BINARY;


Comment le programme sy retrouve avec des ou binaires???
bizu53- 12 oct. 2008 à 17:19
Il peut y avoir plein d'utilités à faire des OU ou ET. Cela simplifie parfois le code.

Pour te donner juste un exemple (parmi tant d'autres) :
Si tu as une chaîne de caractères char *string = "BonJouR";
Si tu veux tout passer en minuscule (Je crois qu'il existe une fonction qui le fait, mais ce n'est qu'un exemple) il te suffit de fixer bit correspondant à 1 (avec un masque 0010 0000).

for(i = 0 ; i < strlen(string) ; i++) string[i] |= 0x20;

Le masque ne touche pas aux bits placés là où il y a un "0" dans ce masque. Parcontre là où il y a un "1" dans le masque, le "OU" te permet de toujours sortir un "1".
Ajouter un commentaire
Réponse
-1
moins plus
Salut,

Comment le programme sy retrouve avec des ou binaires???
Le compilateur s'en sors très bien, tant que le programme respecte la syntaxe.
Le résultat désiré est en fonction de la logique du programme.
Donc il faut étudier le code pour voir le besoin de cette affectation.
include <stdio.h>

#define CMS_BINARY 0x80
#define CMS_DETACHED 10

int main()
{
  int flags=CMS_DETACHED;
  printf("%d\n",flags);
  flags|=CMS_BINARY;

  printf("%d\n",flags);
  return 0;
}

Ajouter un commentaire
Réponse
-1
moins plus
hello
ça permet de tester un bit dans ce genre de définitions

#define		TIOCM_LE	0001		/* line enable */
#define		TIOCM_DTR	0002		/* data terminal ready */
#define		TIOCM_RTS	0004		/* request to send */
#define		TIOCM_ST	0010		/* secondary transmit */
#define		TIOCM_SR	0020		/* secondary receive */
#define		TIOCM_CTS	0040		/* clear to send */
#define		TIOCM_CAR	0100		/* carrier detect */
#define		TIOCM_CD	TIOCM_CAR
#define		TIOCM_RNG	0200		/* ring */
#define		TIOCM_RI	TIOCM_RNG
#define		TIOCM_DSR	0400		/* data set ready */
bizu53- 12 oct. 2008 à 17:21
C'est vrai que cet exemple là est peut-être plus parlant que le mien ... ^^ (de toute façon il y a plein d'utilités...)
dubcek- 12 oct. 2008 à 17:26
par exemple pour tester si un entier est impair
if( i & 1 )
Ajouter un commentaire
Réponse
-2
moins plus
Salut,


Dans les tutos de langage C sur le net on ne parle pas de ces operateurs.

T'en es sûr?!
http://www.commentcamarche.net/c/cop.php3
http://www.idris.fr/data/cours/lang/c/c_repert/tab_priorite.html


flags &= ~CMS_DETACHED;
[...]
flags |= CMS_BINARY;


est équivalent à
flags &= flag & ( ~CMS_DETACHED);
[...]
flags = flag | CMS_BINARY;

Ajouter un commentaire
Réponse
-2
moins plus
Re,

voir aussi http://www.cybwarrior.com/FR/Langage-C-Operateurs.html
Ajouter un commentaire
Ce document intitulé « Operateurs |= &= ~ en langage C » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?