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.