在此按位运算符 if 语句中比较的是什么?

What is being compared in this Bitwise Operator if statement?

我试图理解别人编写的函数,但我很难理解 for 循环内的第二个 if 语句。有人可以解释这里的逻辑吗?实际比较的是什么?

table CMS_ROLE 的数据包含以下列:ID、ROLE_MASK、ROLE_KEY。两者都是 varchar(100)。 ROLE_MASK 是标题,例如经理、作者、管理员等。ROLE_KEY 是分配给 ROLE_MASK 的编号。

1 |经理 | 1

2 |作者 | 4

3 |管理员 | 9

 function roleKeys($roleMask)
{
    $roleKeys = array();
    $this->queryBuilder
        ->select(array("ROLE_MASK", "ROLE_KEY"))
        ->from("CMS_ROLE");
    $roles = $this->queryBuilder->execute()->fetchAll();
    foreach ($roles as $role) {
        if ($roleMask) {
            if ((intval($roleMask) & intval($role["ROLE_MASK"])) == intval($roleMask)) $roleKeys[] = $role["ROLE_KEY"];

        } else if (!$role["ROLE_MASK"]) {
            $roleKeys[] = $role["ROLE_KEY"];
        }
    }
    return $roleKeys;
}

更新:

这是我的 var_dump 输出。还是一头雾水。

echo "intval role_mask : " ; var_dump(intval($role["ROLE_MASK"]));
echo "if statement : " ; var_dump( intval($roleMask & intval($role["ROLE_MASK"])));
echo "<br />-----------------<br />";

intval role_mask :
int 0
if statement :
int 0

-----------------
intval role_mask :
int 1
if statement :
int 1

-----------------
intval role_mask :
int 2
if statement :
int 0

-----------------
intval role_mask :
int 4
if statement :
int 0

-----------------
intval role_mask :
int 8
if statement :
int 0

-----------------
intval role_mask :
int 16
if statement :
int 0

-----------------
intval role_mask :
int 32
if statement :
int 32

-----------------
intval role_mask :
int 99
if statement :
int 97

-----------------
intval role_mask :
int 98
if statement :
int 96

-----------------
intval role_mask :
int 97
if statement :
int 97

-----------------

如果您有一组标志 $flags 和一个位掩码 $bitMask,检查位掩码中的所有位是否都已设置的方法是:

if (($flags & $bitMask) == $bitMask)

这就是你的表达式,除了交换 & 的参数(这无关紧要)。

例如,假设 $flags0x1110$bitMask0x0110。如果您将这两个值加在一起,您将得到 0x0110。这通过了测试,因为该值等于 $bitMask.

现在假设 $flags0x1110$bitMask0x0111。将它们组合在一起产生 0x0110。该值 匹配 $bitMask,因此测试失败。并非位掩码中的所有位都设置在标志变量中——即最右边的位。

下面简单解释一下按位运算符的工作原理,应该能帮助你理解程序员的意图

假设变量具有以下值:

案例 1:

$roleMask = 5;
$role["ROLE_MASK"] = 5;

对于 if 语句:

if ((intval($roleMask) & intval($role["ROLE_MASK"])) == intval($roleMask)) $roleKeys[] = $role["ROLE_KEY"];

条件:

((intval($roleMask) & intval($role["ROLE_MASK"]) == intval($roleMask))

解决如下:

5 in binary = 101

然后101和101逐位比较 按位 AND 遵循以下规则:

1 compared to 1 = 1
1 compared to 0 = 0
0 compared to 0 = 0
0 compared to 1 = 0

这给出:

1 compared to 1 = 1
0 compared to 0 = 0
1 compared to 1 = 1

101十进制是5,所以

(5 & 5) = 5

if 语句变为

if ((5 & 5) == 5) $roleKeys[] = $role["ROLE_KEY"];

解析为

if (5 == 5) $roleKeys[] = $role["ROLE_KEY"];

案例 2:

$roleMask = 6;
$role["ROLE_MASK"] = 7;

对于 if 语句:

if ((intval($roleMask) & intval($role["ROLE_MASK"])) == intval($roleMask)) $roleKeys[] = $role["ROLE_KEY"];

条件:

((intval($roleMask) & intval($role["ROLE_MASK"]) == intval($roleMask))

解决如下:

6 in binary = 110
7 in binary = 111

然后将110与111逐位比较 遵循与上述相同的规则,这给出:

1 compared to 1 = 1
1 compared to 1 = 1
0 compared to 1 = 0

110的十进制是6,所以

(6 & 7) = 6

if 语句变为

if ((6 & 7) == 6) $roleKeys[] = $role["ROLE_KEY"];

解析为

if (6 == 6) $roleKeys[] = $role["ROLE_KEY"];

案例 3:

$roleMask = 7;
$role["ROLE_MASK"] = 4;

对于 if 语句:

if ((intval($roleMask) & intval($role["ROLE_MASK"])) == intval($roleMask)) $roleKeys[] = $role["ROLE_KEY"];

条件:

((intval($roleMask) & intval($role["ROLE_MASK"]) == intval($roleMask))

解决如下:

7 in binary = 111
4 in binary = 100

然后将111与100逐位比较 遵循与上述相同的规则,这给出:

1 compared to 1 = 1
1 compared to 0 = 0
1 compared to 0 = 0

100 的十进制是 4,所以

(7 & 4) = 4

if 语句变为

if ((7 & 4) == 7) $roleKeys[] = $role["ROLE_KEY"];

解析为

if (4 == 7) $roleKeys[] = $role["ROLE_KEY"];

在这种情况下,比较未通过测试。希望这对您有所帮助