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?

Danny Kopping
la source
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);
Matthieu
la source
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