使用bitcode

时间:2014-03-03 18:49:00

标签: php bitset

对于SO来说这只是一点点OT,因为我不是要解决一个特定的问题,而只是为了理解某些事情的实现方式。但我是在代码之后,所以让我们看看它是怎么回事......

假设我们在一周中的每一天都有一个复选框,我们决定将这些复选框的任意组合存储为单个数字,例如:

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

如何在PHP中实现该逻辑,以便如果我提交说“13”,PHP会知道只勾选星期一,星期三和星期四的复选框?

2 个答案:

答案 0 :(得分:16)

按位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

除了这两种方法之外,还有两种方法可以去除这种特殊的猫,但“最佳”方式取决于你的结果/输出需要的是什么。

答案 1 :(得分:6)

为了避免代码结构重复(许多类似的if条款)并引入额外的&#34;魔法&#34;数字(27),如图Sammitch's working suggestions所示,我更喜欢以下内容。

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