有人可以解释一下这是如何工作的吗?非常感谢:)
define("FLAG_A", 1);
define("FLAG_B", 2);
define("FLAG_C", 4);
function test_flags($flags=false) {
if ($flags & FLAG_A) echo "A";
if ($flags & FLAG_B) echo "B";
if ($flags & FLAG_C) echo "C";
}
test_flags(FLAG_A|FLAG_B);
答案 0 :(得分:3)
这是使用所谓的bitwise math完成的。具体来说,他们使用&
(按位和)操作来检查是否设置了值。为了这里的论证,我们将使用4位数字,以保持简短。
7位二进制数字7如下:
0111
每个数字的值都是每次加倍,并且所有数字都加在一起使总数为7.细分,它的工作原理如下:
0 1 1 1
^ ^ ^ ^
| | | |
8 4 2 1
所以,基本上,它是:
0 * 8 + 1 * 4 + 1 * 2 + 1 * 1 = 7
现在,使用按位数学,特别是按位数,我们可以说我们只关心某些列中的位 - 基本上,每列中的位必须为1,否则它将设置为零。所以,检查' 4'里面' 7'用逐位数学:
0111 (7)
& 0100 (4)
______
0100 (4)
由于此值不为零,因此我们可以确定值4在值7内。现在考虑数字11:
1 0 1 1
^ ^ ^ ^
| | | |
8 4 2 1
1 * 8 + 0 * 4 + 1 * 2 + 1 * 1 = 11
尝试寻找4
1011 (11)
& 0100 (4)
______
0000 (0)
因为它的值为0,所以它是假的,我们可以认为数字(4)不在数字11内。
类似地,我们可以得出结论,数字4,2和1,但不是8,在7中。在11中,我们有8,2和1.通过将数字视为一系列位而不是单数值,我们可以在一个整数内存储许多标志。
绝对做一些关于按位数学的阅读,如果正确使用它会非常有用,只是不要试图将它变成一切。
答案 1 :(得分:1)
这是基于按位运算符。想想
define("FLAG_A", 0001); // in binary form
define("FLAG_B", 0010);
define("FLAG_C", 0100);
因此,例如,$flags & FLAG_A
是变量$flags
和常量FLAG_A
之间的按位AND。