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当然,但我们迭代了整个数组,因此它们的显式用法是不必要的。查看“魔术”
更好吗?