我试图在我工作的公司系统中理解这段代码,但这对我来说没有任何意义。
$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