4 votes

Que signifient ces deux opérateurs "|=" et "|" ?

J'ai trouvé cette ligne dans le code source d'une application mais je n'arrive pas à comprendre la signification de l'opérateur " bitwise " ou " inclusive ". | " entre les deux drapeaux.

notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);

Je n'ai pas non plus compris la signification de cet opérateur |= dans la ligne suivante :

notification.flags |= Notification.FLAG_AUTO_CANCEL;

Quelqu'un pourrait m'aider, s'il vous plaît.

7voto

Matt Taylor Points 1685

J'avais commencé ma réponse alors que personne n'avait répondu, alors j'ai décidé de la terminer quand même...

Le tuyau et l'esperluette | and & effectuer le OR y AND respectivement.

Vous aurez l'habitude de voir || y && qui réalisent la logique booléenne OR y AND et l'utilisation d'un seul | or & est une opération par bit.

Si vous regardez dans la documentation des drapeaux, le drapeau pour clear_top est 0x04000000, et single_top est 0x20000000.

L'opération que vous effectuez est donc : 0x04000000 OU 0x20000000 = 0x24000000

qui définit les bits requis dans l'intention d'utiliser les deux drapeaux souhaités.

En a |= b est l'équivalent surchargé de a = a | b similaire à l'utilisation de += , -- o ++ que vous devriez avoir l'habitude de voir ailleurs

2voto

Nirali Points 4203

A | b est l'opération OU par bit de a et b.

Il s'agit de l'affectation par l'opération "bitwise OR".

a1 |= a2;

est un diminutif de :

a1 = a1 | a2;

|= se lit de la même manière que +=.

2voto

Eli Turchinsky Points 331

Supposons par exemple que FLAG_ACTIVITY_CLEAR_TOP est égal à 2 et FLAG_ACTIVITY_SINGLE_TOP à 4. En binaire, la représentation sera donc 0000000010 pour la valeur décimale 2 et 00000100 pour la valeur 4. L'opération binaire ou entre ces deux valeurs donnera la valeur 6 : 00000110 (Les bits on de 2 et 4 sont on). L'utilisation de puissances de deux valeurs pour les constantes d'aspiration garantira que seules des valeurs uniques sortiront après l'opération binaire ou :

Par exemple : 1 est 00000001 2 est 00000010 4 est 00000100 8 est 00001000 16 est 00010000 .....

Si vous configurez les drapeaux de cette manière, il est très facile de décoder les drapeaux originaux : il suffit d'effectuer une opération ET au niveau du bit avec le drapeau original, si c'est zéro, alors le drapeau n'est pas là - si c'est le drapeau lui-même, alors le drapeau est en place.

Par exemple : vérifions 000011000 pour le flag SOME_FLAG - et disons pour le porpuse de l'exemple que sa valeur est 8 - 00001000. Après l'opération "bit à bit" : 00011000 & 00001000 - Nous obtiendrons 00001000, ET avec quelque chose d'autre (qui n'inclut pas le drapeau SOME_FLAG - comme tout autre drapeau avec une valeur de puissance de 2) retournera 0.

1voto

Bathsheba Points 23209

C'est la même chose que notification.flags = (notification.flags | Notification.FLAG_AUTO_CANCEL);

cf. a += b est équivalent à a = (a + b);

où j'ai utilisé les parenthèses superflues pour plus de clarté.

1voto

das_j Points 583

Pour autant que je sache, ce sont des opérateurs de bits.

Comme Bathsheba l'a écrit, c'est égal à (notification.flags | Notification.FLAG_AUTO_CANCEL);

C'est une logique ou, pour des informations voir ici : Oracle.com

Infos sur ou à Wikipedia .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X