Rechercher : dans
Par :

Operateurs |= &= ~ en langage C

Dernière réponse le 12 oct 2008 à 22:33:40 cyrard, le 12 oct 2008 à 15:55:29 
 Signaler ce message aux modérateurs

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

Configuration: Linux Kubuntu 7.04 gutsy
Kdevelop

Meilleures réponses pour « Operateurs |= &= ~ en langage C » dans :
Langage C - Les opérateurs Voir Qu'est-ce qu'un opérateur ? Les opérateurs sont des symboles qui permettent de manipuler des variables, c'est-à-dire effectuer des opérations, les évaluer, etc. On distingue plusieurs types d'opérateurs : les opérateurs de calcul les opérateurs...
Langage C++ - Les types de données Voir Les types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître...
Les files en langage C VoirLes files - Premier Entré Premier Sorti Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la file IV. Opérations sur les files A. Initialisation B. Insertion d'un élément dans la file C. Oter un...
Les piles en langage C VoirLes piles Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la pile IV. Opérations sur les piles A. Initialisation B. Insertion d'un élément dans la pile C. Ôter un élément de la pile D. Affichage...
[Langage C] C/C++ Erreur de segmentation VoirQu'est ce qu'une erreur de segmentation Vous êtes en train de développer une application sous Linux en C/C++. Tout va bien, ça compile, les oiseaux chantent. Donc vous lancez votre application pour la tester. Et vous obtenez l'un de ces deux...
Langage C - Les types de données VoirLes types de données Les données manipulées en langage C sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître l'occupation mémoire (le...
Langage C - Les chaînes de caractères VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C, une chaîne...

1

bizu53, le 12 oct 2008 à 16:09:14

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.

Répondre à bizu53

2

lami20j, le 12 oct 2008 à 16:11:50

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;

106485010510997108

Répondre à lami20j

3

lami20j, le 12 oct 2008 à 16:13:40
Répondre à lami20j

4

cyrard, le 12 oct 2008 à 16:26:13

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???

Répondre à cyrard

7

bizu53, le 12 oct 2008 à 17:19:39

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".

Répondre à bizu53

5

lami20j, le 12 oct 2008 à 16:36:28

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;
}

106485010510997108

Répondre à lami20j

6

dubcek, le 12 oct 2008 à 17:12:57

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 */

Répondre à dubcek

8

bizu53, le 12 oct 2008 à 17:21:14

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...)

Répondre à bizu53

9

dubcek, le 12 oct 2008 à 17:26:29

Par exemple pour tester si un entier est impair

if( i & 1 )

Répondre à dubcek

10

 cyrard, le 12 oct 2008 à 22:33:40

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!

Répondre à cyrard