[Résolu] Ou dans un int ? La différence entre '|' et '||'

iLandesiLandes Membre
décembre 2014 modifié dans Objective-C, Swift, C, C++ #1

Bonjour,


 


Bien que ce code issu de la doc fait clairement ce que je cherche à  faire je ne comprends pas la ligne 3. Autodidacte je rencontre quelque fois ce genre de problème certainement lié à  des manques dans les bases fondamentales.


 


Qu'est-ce qu'un int affecté avec des | (ou) ?


 


D'avance merci pour vos éclaircissements.



NSDate *startDate = ...;
NSDate *endDate = ...;
unsigned int unitFlags = NSMonthCalendarUnit | NSDayCalendarUnit;
NSDateComponents *comps = [gregorian components:unitFlags fromDate:startDate toDate:endDate options:0];
int months = [comps month];
int days = [comps day];

Pour être à  jour, la ligne 3 doit être mise à  jour avec les nouvelles constantes



unsigned int unitFlags = NSCalendarUnitSecond | NSCalendarUnitMinute | NSCalendarUnitHour | NSCalendarUnitDay ;

Réponses

  • CéroceCéroce Membre, Modérateur
    décembre 2014 modifié #2

    L'opérateur | est l'opérateur OU bit à  bit.

    Cherche sur le web on trouve facilement des informations à  ce sujet.
    Pour commencer.


     


    Les constantes sont souvent définies avec l'opérateur de décalage de bit:


    Par exemple:


    OptionA = 1 << 0 = 1b


    OptionB =1 << 1 = 10b


    OptionC = 1 << 2 = 100b


    OptionD = 1 << 3 = 1000b


     


    Alors, pour combiner les options A et C, on va écrire:


    options = OptionA | OptionC


    Ce qui donne


    option = 1b OU 100b = 101b


     


    Etudie les opérateur |, & et << et cela deviendra clair.


  • AliGatorAliGator Membre, Modérateur

    Qu'est-ce qu'un int affecté avec des | (ou) ?

    Effectivement comme l'explique Céroce, le "|" est le OU bit-à -bit. A ne pas confondre avec le OU logique "||".

    Le OU logique "||" retourne YES (true) si au moins une de ses opérande est vraie (YES/true).
    Le OU bit-à -bit intervient sur chaque bit de l'octet ou du word considéré. Chaque bit est mis à  1 si au moins un des 2 bits correspondants pour chaque opérande est à  1. Donc le bit le plus à  droite du résultat sera à  1 si le bit le plus à  droite d'une des 2 opérandes est à  1. Et pareil pour chacun des autres bits.

    Cela est très utilisé avec les NS_OPTIONS (qui sont déclarées comme l'indique Céroce, avec les décalages, pour que chaque valeur possible n'ait qu'un seul bit à  1 (différent du bit déjà  à  1 pour les autres options) et les autres bits à  0. Ainsi, on peut voir le int comme un espèce de tableau de booléens, chaque bit du int indiquant si l'option correspondante est activée (1) ou non (0).




  • Cela est très utilisé avec les NS_OPTIONS (qui sont déclarées comme l'indique Céroce, avec les décalages, pour que chaque valeur possible n'ait qu'un seul bit à  1 (différent du bit déjà  à  1 pour les autres options) et les autres bits à  0. Ainsi, on peut voir le int comme un espèce de tableau de booléens, chaque bit du int indiquant si l'option correspondante est activée (1) ou non (0).




     


    au début de l'informatique c'était très utile et pratique pour economiser la mémoire... on a conservé l'habitude...

  • Au début de l'informatique on économisait aussi la mémoire en retirant les "19" des dates, sans penser qu'un jour on allait atteindre l'an 2000. Les conséquences financières de cette "habitude" ont été .. plusieurs centaines de milliards de $ dépensés frénétiquement à  la fin des années 1990 pour relire/réécrire des montagnes de lignes de code, évitant (avec succès) le BUG DE L'AN 2000. Je n'aurais pas aimé qu'un silo nucléaire commence à  lancer ces missiles sur Moscou parce qu'un développeur avait "économisé" quelques bits dans une date. Méfiez-vous des habitudes les gars !

  • Merci pour vos explications toujours claires


     


    Donc ne pas confondre '|' et '||' !


     


    J'imagine qu'il existe aussi un '&' ?


  • DrakenDraken Membre
    décembre 2014 modifié #7

    & -> AND bit à  bit (opérateur ET bit à  bit pour les francophiles)


  • Le & va te permettre de voir si une option est présente dans ta valeur.


     


    Exemple : si option = AnimationEaseIn | AnimationWithInterruption | AnimationCrossDissolve


     


    je dis que je veux une animation qui démarre lentement, qui puisse être interrompue et qui fasse une dissolution avec l'écran précédent 


     


    Si dans le code je veux tester si dans l'option que je passe en paramètre à  une méthode j'ai dit que je pouvais interrompre l'animation, mon code sera



    if (option & AnimationWithInterruption)
    {
    ...
    }

    option & AnimationWithInterruption vaut 1 si AnimationWithInterruption est "contenu" dans mes options et 0 sinon.


  • AliGatorAliGator Membre, Modérateur

    option & AnimationWithInterruption vaut 1 si AnimationWithInterruption est "contenu" dans mes options et 0 sinon.

    Heu c'est pas tout à  fait vrai ça...

    "option & AnimationWithInterruption" va valoir AnimationWithInterruption si option contient se flag, et 0 sinon.

    Par exemple si options = "11011010" et AnimationWithInterruption = "00010000", alors "11011010 & 00010000" va valoir 000100000 (car 0&x donne toujours zéro donc chaque bit à  zéro dans AnimationWithInterruption va être "masqué" et valoir forcément zéro, et le seul bit à  1 dans AnimationWithInterruption va valoir x, donc la valeur (0 ou 1) du bit correspondant dans "options") et non pas 1.
  • Oui, merci de ta correction !


Connectez-vous ou Inscrivez-vous pour répondre.