Operaciones de precedencia y máscara de bits

94

Me he encontrado con un caso (aparentemente) muy extraño.

Tome el número 2 ( 0b10) y enmascarelo con 1 ( 0b01)

Esto debería producir lo 0b00que es equivalente a 0.

Sin embargo, aquí es donde entra el señor Schrödinger:

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

Whisky. Tango. Fox.

Es cierto que no soy el más agudo cuando se trata de operadores bit a bit, así que tal vez me haya equivocado horriblemente en alguna parte.

Sin embargo, en Python:

0b10 & 0b01 == 0 = True

0b10 & 0b01 != 0 = False

...¿entonces?

Danny Kopping
fuente
No lo hago en PHP, pero en C, C ++, simplemente podría escribir comovar_dump(!(0b10 & 0b01))
Grijesh Chauhan
2
Sin embargo, algo más extraño: 0b0+1evalúa 2en algunas versiones, debido a un error del analizador.
Lily Chung

Respuestas:

150

Realmente estás haciendo esto:

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

Tratar:

var_dump((0b10 & 0b01) == 0);
var_dump((0b10 & 0b01) != 0);
Mateo
fuente
6
Me parece que PHP tiene precedencia general de operadores de strnage.
Alvin Wong
23
Supongo que es por eso que NUNCA confío en la precedencia en ningún idioma. Además, creo que los paréntesis hacen que el código sea más legible. En casos extremos, es posible que desee (re) agrupar y comentar brevemente las cosas.
Sin respuesta
2
@AlvinWong ¡Tienes razón! Creo que rara vez un código necesita una expresión condicional, como 0b10 & (0b01 == 0)por qué alguien aplicaría bit a bit con un tipo de información sí no.
Grijesh Chauhan
4
Bueno, considere un ejemplo más común: el operador ternario, PHP lo tiene al revés, lo que lo hace diferente a todos los demás lenguajes. Ref: phpsadness
Alvin Wong
5
Es por eso que en C y C ++ la gente tiene advertencias para estas cosas.
PlasmaHH