Operaciones de precedencia y máscara de bits

2 minutos de lectura

avatar de usuario
danny kopping

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

Toma el número 2 (0b10) y máscara de bits con 1 (0b01)

Esto debería producir 0b00 que es equivalente a 0.

Sin embargo, aquí es donde entra 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 inteligente en lo que respecta a los operadores bit a bit, ¿así que tal vez me equivoqué terriblemente, terriblemente en alguna parte?

Sin embargo, en Python:

0b10 & 0b01 == 0 = True

0b10 & 0b01 != 0 = False

…¿asi que?

  • No lo hago en PHP, pero en C, C ++ simplemente podría escribir como var_dump(!(0b10 & 0b01))

    –Grijesh Chauhan

    24 de febrero de 2014 a las 10:28

  • Aunque algo más raro: 0b0+1 evalúa a 2 en algunas versiones, debido a un error del analizador.

    – Lily Chung

    24 de febrero de 2014 a las 16:06


En realidad estás haciendo esto:

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

Probar:

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

  • Me parece que PHP tiene una precedencia de operador extraña en general.

    –Alvin Wong

    24 de febrero de 2014 a las 10:11


  • Supongo que es por eso que yo NUNCA confiar en la precedencia en cualquier 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 cosas breves.

    – Sin respuesta

    24 de febrero de 2014 a las 10:35

  • @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 sí, no tipo de información?

    –Grijesh Chauhan

    24 de febrero de 2014 a las 10:35

  • 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: phptristeza

    –Alvin Wong

    24 de febrero de 2014 a las 10:38

  • Es por eso que en C y C++ la gente tiene advertencias para estas cosas.

    – PlasmaHH

    24 de febrero de 2014 a las 11:43

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad