4 votes

Qu'est-ce que signifient ces deux opérateurs "|=" et "|" ?

J'ai trouvé cette ligne dans le code source d'une application mais je ne comprends pas la signification de l'opérateur bitwise ou inclusif "|" 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-il m'aider s'il vous plaît.

7voto

Matt Taylor Points 1685

J'avais commencé ma réponse alors que personne d'autre n'avait répondu, alors j'ai décidé de la terminer de toute façon...

Le symbole de barre verticale et l'esperluette | et & effectuent respectivement les opérations OU et ET.

Vous avez l'habitude de voir || et &&, qui effectuent la logique booléenne OU et ET, et l'utilisation d'une seule | ou & est une opération sur les bits.

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

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

Qui définit les bits nécessaires dans l'intention d'utiliser les deux drapeaux souhaités.

L'opérateur a |= b est l'équivalent surchargé de a = a | b, similaire à l'utilisation de +=, -- ou ++, que vous devriez être habitué à voir ailleurs

2voto

Nirali Points 4203

A | b est le OU bit à bit de a et b.

C'est l'assignation par OU bit à bit

a1 |= a2;

est équivalent à :

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 soit 2 et que FLAG_ACTIVITY_SINGLE_TOP soit 4. Donc en binaire la représentation sera 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 en 1 à la fois pour 2 et 4 sont allumés). Utiliser des valeurs de puissance de deux pour de telles constantes garantira que seules des valeurs uniques sortiront après la bitwise or :

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

Si vous définissez des drapeaux de cette manière, il est très facile de décoder les drapeaux originaux : il suffit d'effectuer l'opération binaire AND avec le drapeau d'origine, s'il est zéro alors le drapeau n'est pas là - s'il est égal au drapeau lui-même - alors le drapeau est activé.

Par exemple : vérifions 000011000 pour le drapeau SOME_FLAG - et disons à des fins d'exemple que sa valeur est 8 - 00001000. Après l'opération binaire and : 00011000 & 00001000 - Nous obtiendrons 00001000, faire un AND avec quelque chose d'autre (qui n'inclut pas le drapeau SOME_FLAG - comme tout autre drapeau avec une valeur de puissance de 2) renverra 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

Dans la mesure de mes connaissances, il s'agit d'opérateurs de bits.

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

C'est un ou logique, pour plus d'informations voir ici: Oracle.com

Infos sur le ou sur 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