Я пытаюсь создать функцию с флагами в качестве аргументов, но вывод всегда отличается от ожидаемого:
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
Как я могу исправить эту проблему?
Флаги должны иметь силу 2 для поразрядного или совместно правильно.
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
Использование шестнадцатеричной нотации для константных значений не имеет никакого отношения к поведению программы, но является одним идиоматическим способом подчеркнуть для программистов, что значения составляют поле бит . Другим было бы использование сдвигов: 1<<0
, 1<<1
, 1<<2
, & c.