Работа с bitcode

это немного OT для SO, потому что я не пытаюсь решить конкретную проблему, а просто понять, как что-то может быть реализовано. Но мне нужен код, так что посмотрим, как пойдет...

предположим, у нас был флажок для каждого дня недели, и мы решили сохранить любую комбинацию этих флажков как одно число, например:

  0 = no days
  1 = Monday 
  2 = Tuesday
  4 = Wednesday
  8 = Thursday
 16 = Friday
 32 = Saturday
 64 = Sunday
127 = everyday

как можно было бы реализовать эту логику в PHP, чтобы, если бы я представил, скажем, "13", PHP знал бы ставить галочки только в понедельник, среду и четверг?

2 ответов


побитовое ANDs:

$input = 13;

if( $input & 1 ) {
  echo 'Monday';
}
if( $input & 2 ) {
  echo 'Tuesday';
}
if( $input & 4 ) {
  echo 'Wednesday';
}
// etc

редактировать

вы можете избежать ifs с чем-то вроде:

$input = 13;

$days = array('mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun');

for( $i=0; $i<7; $i++ ) {
    $daybit = pow(2,$i);
    if( $input & $daybit ) {
        echo $days[$i] . ' ';
    }
}

//output: mon wed thu

есть больше, чем эти два способа снять кожу с этой конкретной кошки, но "лучший" способ зависит от того, каким должен быть ваш результат/результат.


чтобы избежать дублирования структуры кода (много подобных if предложения) и введение дополнительных "магических" чисел (2, 7), как показано рабочие предложения Sammitch, Я бы предпочел следующее.

$daymap = array(
    1 => Monday,
    2 => Tuesday,
    4 => Wednesday,
    8 => Thursday,
    16 => Friday,
    32 => Saturday,
    64 => Sunday
);

$input = 13;

foreach ($daymap as $code => $name) {
    if ($input & $code) {
        echo $name.' ';
    }
}