Php 使用位代码

Php 使用位代码,php,bitset,Php,Bitset,这有点夸张,因为我不是想解决一个特定的问题,而是想了解如何实现某些东西。但我在寻找代码,所以让我们看看它是如何进行的 假设一周中的每一天都有一个复选框,我们决定将这些复选框的任意组合存储为一个数字,这样: 0 = no days 1 = Monday 2 = Tuesday 4 = Wednesday 8 = Thursday 16 = Friday 32 = Saturday 64 = Sunday 127 = everyday 如何在PHP中实现该逻辑,以便如果

这有点夸张,因为我不是想解决一个特定的问题,而是想了解如何实现某些东西。但我在寻找代码,所以让我们看看它是如何进行的

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

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

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

按位
s:

$input = 13;

if( $input & 1 ) {
  echo 'Monday';
}
if( $input & 2 ) {
  echo 'Tuesday';
}
if( $input & 4 ) {
  echo 'Wednesday';
}
// etc
编辑 您可以通过以下方式避免
if
s:

$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
$input=13;
$days=数组('mon','tue','wed','thu','fri','sat','sun');

对于($i=0;$iAs,以避免代码结构重复(大量类似的
if
子句)和引入额外的“神奇”数字(
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.' ';
    }
}

哦,哇-这比我想象的还要简单!现在我觉得自己真的很笨:-(-谢谢!好吧,没有所有的ifs我们能做吗?@草莓添加了一个只有一个
if
的例子。使用移位运算符不比调用
pow()更合适吗?)
?我的目的不是优化性能,而是提高可理解性。通过移位,我首先将对位的操作与二进制和对我而言的操作联系起来。
pow
函数似乎更倾向于数学。我的意思是使用fit这个词。
2
不是一个神奇的数字,因为它表示数字系统的使用d(在本例中,
binary
-
0
1
7
可以通过
count($days)
轻松切换,以消除魔法。也就是说,我同意您的方法更好、更易于阅读。@h2ooooooo当然,但我们迭代了整个数组,因此它们的显式用法是不必要的。查看
“魔术”
更好吗?