如果代码,PHP背后的逻辑

时间:2015-01-26 01:34:38

标签: php algorithm

我正在尝试在我正在工作的公司系统中理解这段代码,但这对我没有任何意义。

$k = 48;

if (($k & 2) > 0) {

 echo "2 is true";
}

echo "<br />";
if (($k & 4) > 0) {
 echo "4 is true";
}

echo "<br />";
if (($k & 8) > 0) {
 echo "8 is true";
}
echo "<br />";
if (($k & 16) > 0) {
 echo "16 is true";
}
echo "<br />";
if (($k & 32) > 0) {
 echo "32 is true";
}

当$ k为10或11时,2和8都为真。

当$ k为12或13时,4和8都为真。

请帮我解决这个问题

2 个答案:

答案 0 :(得分:4)

此代码只是检查某些位位置是否设置为某个值$k。了解bitwise airthmetic的工作原理。

在您发送给我们的代码中,它没有太多背景信息。但是,这是检查位掩码中值的典型模式。

但一般情况下,> 0是不必要的(因为!0通常只有== true}。

重要的是要注意,当我说位位置时,我的意思是二进制数。也就是说,$k & 32不会检查第32位,而是检查第6个最高位(32d == 0b100000)。

简短示例

考虑最后一个陈述。我们已经确定小数32在二进制中看起来像100000。现在说我们要检查第6位是否设置在某个数字33中.33表示为二进制的0b100001。现在我们采用bitwise and,它的运算方式与我们以前在10(即十进制)中看到的乘法非常相似。

0b100000 <--- decimal 32
&
0b100001 <--- decimal 33
--------
0b100000 <--- Result is > 0 and, therefore, this value has the 6th bit set

现在,让我们用不同的数字重试这个例子。小数15怎么样。

0b100000 <--- decimal 32
&
0b001111 <--- decimal 15
--------
0b000000 <--- Result == 0 and, therefore, the 6th bit is not set

现在,这个&(不要与表示为logical and的{​​{1}}混淆)也适用于多个位。假设您要检查第6位和第4位,那么您可能希望使用&&(十进制0b101000),但取决于您要测试的内容(即恰好是那些位或只是其中一位) ),您的条件可能会改变。

再多一点 从风格的角度来看,重要的是要注意这些掩码通常用十六进制表示而不是十进制(或二进制,因为这将是麻烦的)。这主要是因为有些不清楚十进制数字的二进制表示在查看它时一目了然。&#34;一目了然。&#34;让我们再次考虑十进制32.在十六进制中,二进制数可以通过简单地将位分组为4(从右到左)来表示为十六进制数。见下文

40

如您所见,十六进制20是十进制32是二进制100000。

答案 1 :(得分:3)

在你的代码中只有一些按位AND运算,用于检查是否设置了某些位。

因此,如果我们看看第一个发生了什么:

$k = 48;

if (($k & 2) > 0) {
    echo "2 is true";
}

表达式($k & 2)更具可读性:

0011 0000   $k
0000 0010   2
------------ &
0000 0000      = 0

所以if (0 > 0)是假的

另一个例子:

if (($k & 16) > 0) {
    echo "16 is true";
}

表达式($k & 16)更具可读性:

0011 0000   $k
0001 0000   16
------------ &
0001 0000      = 16

所以if (16 > 0)是真的

供参考资料:

按位AND操作表:

  A  |  B  | Result
--------------------
  0  |  0  |   0
  0  |  1  |   0
  1  |  0  |   0
  1  |  1  |   1

此处参考手册:http://php.net/manual/en/language.operators.bitwise.php