2010-08-28 19 views
15

Estoy intentando crear una función con banderas como sus argumentos, pero la salida es siempre diferente, con lo que se espera:Banderas de funciones de PHP, ¿cómo?

define("FLAG_A", 1); 
define("FLAG_B", 4); 
define("FLAG_C", 7); 
function test_flags($flags) { 
if($flags & FLAG_A) echo "A"; 
if($flags & FLAG_B) echo "B"; 
if($flags & FLAG_C) echo "C"; 
} 
test_flags(FLAG_B | FLAG_C); # Output is always ABC, not BC 

¿Cómo puedo solucionar este problema?

Respuesta

25

Las banderas deben tener potencias de 2 en orden a bit o juntas correctamente.

define("FLAG_A", 0x1); 
define("FLAG_B", 0x2); 
define("FLAG_C", 0x4); 
function test_flags($flags) { 
    if ($flags & FLAG_A) echo "A"; 
    if ($flags & FLAG_B) echo "B"; 
    if ($flags & FLAG_C) echo "C"; 
} 
test_flags(FLAG_B | FLAG_C); # Now the output will be BC 

Utilizando la notación hexadecimal para los valores constantes no hace ninguna diferencia en el comportamiento del programa, pero es una forma idiomática de hacer hincapié en que los programadores que los valores componen una bit field. Otro sería usar turnos: 1<<0, 1<<1, 1<<2, & c.

+0

Aah, ¡muchas gracias por su ayuda! – Teiv

+2

Amigo, las expectativas de salida de Su comentario no es correcto. Porque la salida siempre será de otra manera: BC en lugar de ABC y este es un comportamiento correcto para el programa. –