php if 代码背后的逻辑


Logic behind php if code

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

$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 都为真。

请帮我弄清楚

这段代码只是检查某些位位置是否在某个值中设置$k。了解按位空气的工作原理。

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

但是,一般来说,> 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混淆)也适用于多个位。假设您要检查第 6 位和第 4 位,那么您需要使用 0b101000(十进制40),但根据您要测试的内容(即确切的那些位或只是其中一个位),您的条件可能会改变。

再多一点从样式的角度来看,重要的是要注意这些掩码通常以十六进制而不是十进制(或二进制表示,因为这会很麻烦)。这主要是因为当十进制数"一目了然"时,不清楚它与什么二进制表示相关。让我们再次考虑十进制 32。在十六进制中,二进制数可以通过简单地按 4(从右到左)分组位来表示为十六进制数。见下文

0b100000 <--- decimal 32
    0000  === 0x0 (hexadecimal 0)
  10      === 0b0010 (implied leading 0's) === 0x2 (hexadecimal 2)
--------
0x20

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

在你的代码中,只有一些按位 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)是真的

仅供参考信息:

按位和操作表:

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

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