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 :

À quoi servent les opérateurs binaires?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2020
    Messages : 4
    Par défaut À quoi servent les opérateurs binaires?
    Bonjour à tous,
    Je viens de commencer à apprendre le C, et les opérateurs binaires me causent du retors. Je ne comprend pas dans quel cas pratique les opérateurs &, |, ^ et ~ peuvent servir(les explications que je trouvent ne sont pas très claires).
    Quelqu'un pourrait il éclairer ma lanterne?

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    Les opérateur << et >> peuvent aussi rendre de bons services quand on travaille sur des champs de bits.
    On peut se poser la question sous la forme : Quand a-t-on besoin de modéliser plusieurs informations binaires dans une seule variable?
    Prenons l'exemple d'un labyrinthe composé de cellules carrées. Dans chaque cellule on a la possibilité d'aller vers Sud, Est, Nord et Ouest. On peut représenter cela avec 4 variables : bool SudPossible, bool EstPossible, bool NordPossible, bool OuestPossible ou bien une seule que on appellera int Possibilites.
    En écrivant en binaire Je pose que l'accès autorisé vers Sud vaut 0001, Est vaut 0010, Nord vaut 0100 et Ouest vaut 1000.
    Une cellule sans porte où tout est possible vaut donc 1111 c-à-d 15 en décimal.
    Maintenant comment écrire les tests :
    1. Est-ce que la cellule n'a pas de porte ? :
      réponse : if ( Possibilites == (Sud|Est|Nord|Ouest) ) ou if ( Possibilites == 15 ) . Avec les 4 booléens ça serait ...
    2. Est-ce que de la cellule on peut aller vers le Sud
      réponse : if ( (Possibilites & Sud) != 0 ). Avec les 4 booléens c'est plus simple.
    3. Est-ce que la cellule a au moins une sortie ?
    4. Est-ce que la cellule peut être traversée horizontalement ?
    5. Comment décider d'ouvrir la porte Nord, on modifie Possibilites ?
    6. Plus compliqué, comment décider de fermer la porte Nord ?

    En réalité on peut se passer des opérateurs binaires, leur rôle est d'effectuer très rapidement plusieurs sélections ou plusieurs tests. Essaie de répondre aux questions précédentes en posant les 2 cas (4 variables booléennes ou 1 champ de bits)

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par aeco_beats Voir le message
    À quoi servent les opérateurs binaires?
    Réponse immédiate: à opérer en binaire

    Citation Envoyé par aeco_beats Voir le message
    Je ne comprend pas dans quel cas pratique les opérateurs &, |, ^ et ~ peuvent servir(les explications que je trouvent ne sont pas très claires).
    Quelqu'un pourrait il éclairer ma lanterne?
    Cela permet de manipuler (extraire, positionner) les bits au sein d'une valeur. Un int possède au minimum 16 bits. Cela signifie qu'un int possède 16 booléens théoriques donc qu'avec un seul int, on peut traiter 65536 situations indépendantes ou bien 16 situations combinées.

    Un exemple simple: tu veux traiter une population garçon/fille combiné à l'état civil marié/pas marié combiné à la présence d'un casier judicaire ou pas. Avec les langages qui ne connaissent que la variable, il t'en faut 3 différentes. Avec le C (et les autres langages qui peuvent descendre au niveau du bit), tu peux regrouper ça sur un simple char.
    Donc tu définisi les choses ainsi (j'écris juste les 4 derniers bits car les 4 premiers sont à 0)
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #define GARCON 0x01    // 0001
    #define MARIE 0x02      // 0010
    #define CASIER 0x04    // 0100

    Tu veux indiquer qu'un individu garçon n'est pas marié mais il a un casier => char lui=GARCON | CASIER // lui=0101 (éventuellement tu peux aussi écrire char lui=GARCON | (~MARIE) | CASIER)
    Tu veux vérifier s'il est marié => if ((lui & MARIE) != 0) => lui & marie donnera soit 0010 soit 0000 selon la valeur du 3° bit de la variable.
    Un individu se rachète, son casier disparait. Te suffit d'écrire lui=lui & (~CASIER) et son sexe garçon/fille ainsi que son état civil marié/pas marié resteront identiques tandis que son casier passera à 0.
    Et un jour un lapin crétin arrive avec son rayon et transforme tous les garçons en filles et inversement => pas de souci de ton côté, te suffit d'écrire lui=lui^GARCON.

    Si tu travailles sur Unix (et OS de la même famille comme BSD, FreeBSD, Linux, etc) tu dois savoir qu'il y a 7 types de fichiers distincts (classiques, dossiers, liens symboliques, pipes, blocs, caractères, sockets). De plus, ces fichiers possèdent 9 droits ordinaires (les R, W et X sur U, G et O) plus 3 droits spéciaux (setuid, setgid, sticky bit). Ben toutes ces caractéristiques sont combinées sur un seul int. 4 bits pour les types (ce qui permettrait si besoin de monter à 16 types puisque ce sont des cas indépendants car un fichier ne peut pas être à la fois dossier et pipe), 9 bits pour chacun des rwxrwxrwx et 3 bits pour les sst.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2020
    Messages : 4
    Par défaut
    Salut à tous, merci de vos réponses
    Si je comprend bien, les opérateurs binaires permettent en quelque sorte de combiner des données (comme le cas du Garçon avec casier ou pas) pour modifier "l'état" de la variable selon plusieurs paramètres.

  5. #5
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 766
    Par défaut
    Pour répondre plus généralement , c'est la logique d'1 ordinateur. C'est 1 grosse partie avec l'algèbre de Boole, les tables de Karnaugh, les opérations bit à bit pour l'introduction (<- liens wiki en français)

    ensuite tu as les applications de tout cela dont le masquage (<- lien wiki en français, c'est ce dont parle @Sve@r)

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par aeco_beats Voir le message
    Si je comprend bien, les opérateurs binaires permettent en quelque sorte de combiner des données
    Hé oui. Et pas forcément que des booléens. Par exemple un processus (toujours sous Unix) peut s'arrêter de 2 façons : de lui-même via exit(n) (n étant compris entre 0 et 255) ou en recevant un signal envoyé par l'extérieur via kill(s) (s lui compris entre 1 et 255).
    Ces 2 valeurs n et s prennent chacune au maximum 8 bits (plage permettant de coder les valeurs entre 0 et 255). Alors quand tu interroges le noyau Unix via wait(int *wstatus) pour vérifier l'état d'un procesuss, tu passes à la fonction l'adresse d'un int que le noyau ira remplir. Et si le processus s'est arrêté via exit(n) alors la valeur "n" ira remplir les 8 derniers bits de l'int tandis que les 8 premiers seront mis à 0. Et si le processus s'est arrêté via kill(s), alors cette valeur "s" ira remplir les 8 premiers bits de l'int (et les 8 derniers ne seront pas impactés donc garderont la valeur aléatoire qu'ils avaient quand la variable a été créé).
    Ainsi en examinant les 8 premiers bits de cet int tu peux voir comment a été arrêté le processus (exit() s'ils sont à 0 et kill() dans le cas contraire). Et ensuite te suffit d'extraire les 8 bits qui t'intéressent pour récupérer la valeur de "n" ou "s" selon le cas (en rajoutant un décalage s'il s'agit de "s").
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. [Généralités] A quoi servent les fonctions binaires
    Par Ratafia67 dans le forum WinDev
    Réponses: 5
    Dernier message: 03/12/2010, 11h20
  2. [MySQL] A quoi servent les réferences entre les tables??
    Par Alain15 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 18/02/2006, 16h19
  3. A quoi servent les index dans une BDD ?
    Par Melvine dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 25/10/2005, 12h14
  4. [CR 10] A quoi servent les Templates Fields ?
    Par caviar dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 10/11/2004, 10h52
  5. [C#] A quoi servent les interfaces???
    Par sof_nns dans le forum Windows Forms
    Réponses: 8
    Dernier message: 28/10/2004, 20h51

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