Работа с битовым кодом

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

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

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

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

Solutions Collecting From Web of "Работа с битовым кодом"

Побитовое AND s:

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

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

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

 $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 

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

Чтобы избежать дублирования структуры кода (много похожих предложений) и введения дополнительных «магических» чисел ( 2 , 7 ), как показано в рабочих предложениях Саммича , я предпочел бы следующее.

 $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.' '; } }