Opérations de priorité et de masque de bits


94

J'ai rencontré un cas (apparemment) très étrange.

Prenez le numéro 2 ( 0b10) et masquez-le avec 1 ( 0b01)

Cela devrait produire l' 0b00équivalent de 0.

Cependant, voici où M. Schrödinger entre en jeu:

var_dump(0b10 & 0b01); // int(0)
var_dump(0b10 & 0b01 == 0); // int(0)
var_dump(0b10 & 0b01 != 0); // int(0)

Whisky. Tango. Fox-trot.

Je ne suis, certes, pas le plus pointu en ce qui concerne les opérateurs au niveau du bit - alors peut-être que j'ai horriblement, horriblement mal quelque part?

Cependant, en Python:

0b10 & 0b01 == 0 = True

0b10 & 0b01 != 0 = False

...alors?


Je ne suis pas en PHP mais en C, C ++, vous pouvez simplement écrire commevar_dump(!(0b10 & 0b01))
Grijesh Chauhan

2
Quelque chose de plus étrange cependant: 0b0+1évalue 2dans certaines versions, en raison d'un bogue de l'analyseur.
Lily Chung

Réponses:


150

Vous faites réellement ceci:

var_dump(0b10 & (0b01 == 0));
var_dump(0b10 & (0b01 != 0));

Essayer:

var_dump((0b10 & 0b01) == 0);
var_dump((0b10 & 0b01) != 0);

6
Il me semble que PHP a globalement la priorité des opérateurs de strnage.
Alvin Wong

23
Je suppose que c'est pourquoi je ne me fie JAMAIS à la préséance dans aucune langue. De plus, je pense que les parenthèses rendent le code plus lisible. Dans les cas extrêmes, vous pourriez vouloir (re) grouper et commenter brièvement les choses.
Pas de réponse le

2
@AlvinWong Vous avez raison! Je pense que rarement un code a besoin d'une expression conditionnelle comme 0b10 & (0b01 == 0)pourquoi quelqu'un appliquerait-il bit à bit avec oui non une sorte d'information.
Grijesh Chauhan

4
Eh bien, considérons un exemple plus courant: l'opérateur ternaire, PHP l'a à l'envers, ce qui le rend différent de tous les autres langages. Ref: phpsadness
Alvin Wong

5
C'est pourquoi en C et C ++, les gens ont des avertissements pour ces choses.
PlasmaHH
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.