Setting, unsetting and testing single and multiple bits in a bitmask:
<?php
const FLAG_A = 0b0001,
FLAG_B = 0b0010,
FLAG_C = 0b0100,
FLAG_D = 0b1000;
const COMBO_BC = FLAG_B | FLAG_C;
$bitmask = 0b000;
// Setting individual flags.
$bitmask |= FLAG_B; // Sets FLAG_B (=2)
$bitmask |= FLAG_C; // also sets FLAG_C (=4)
// Testing single or multiple flags.
echo (bool)( $bitmask & FLAG_B ); // True, B is set.
echo (bool)( $bitmask & (FLAG_A | FLAG_B) ); // True, A or B is set.
echo (bool)( $bitmask & FLAG_B and $bitmask & FLAG_C ); // True, B and C are set.
echo (bool)( ( $bitmask & (FLAG_B | FLAG_C) ) ^ (FLAG_B | FLAG_C) ); // False if B and C are set.
echo (bool)( ( $bitmask & COMBO_BC ) ^ COMBO_BC ); // False if B and C are set.
echo (bool)( $bitmask & FLAG_C and $bitmask & FLAG_D ); // False, C and D are NOT BOTH set.
echo (bool)( ( $bitmask & (FLAG_C | FLAG_D) ) ^ (FLAG_C | FLAG_D) ); // True, if C and D are NOT BOTH set.
// Resetting single flag.
$bitmask &= $bitmask ^ FLAG_B; // Unsets B
$bitmask &= $bitmask ^ FLAG_A; // A remains unset.
var_dump( $bitmask ); // Only C still set (=4)
// Resetting multiple flags.
$bitmask &= $bitmask ^ ( FLAG_C | FLAG_D ); // Unsets C and/or D
var_dump( $bitmask ); // No flags set (=0)