Working with bitcode

2019-01-23 19:32发布

This is slightly OT for SO, because I'm not trying to solve a specific problem, instead just to understand how something might be implemented. But I am after code, so let's see how it goes...

Let's say we had a checkbox for each day of the week, and we decided to store any combination of those checkboxes as a single number, such that:

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

How might one go about implementing that logic in PHP so that if I submitted say, "13", PHP would know to tick only the Monday, Wednesday and Thursday checkboxes?

标签: php bitset
2条回答
再贱就再见
2楼-- · 2019-01-23 20:04

As to avoid code structure duplication (lots of similar if clauses) and introducing extra "magic" numbers (2, 7), as shown Sammitch's working suggestions, I'd prefer the following.

$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.' ';
    }
}
查看更多
一夜七次
3楼-- · 2019-01-23 20:09

Bitwise ANDs:

$input = 13;

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

edit

You can avoid the ifs with something like:

$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

There's more than these two ways to skin this particular cat, but the 'best' way depends on what your result/output needs to be.

查看更多
登录 后发表回答