在此按位运算符 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)
这就是你的表达式,除了交换 &
的参数(这无关紧要)。
例如,假设 $flags
是 0x1110
,$bitMask
是 0x0110
。如果您将这两个值加在一起,您将得到 0x0110
。这通过了测试,因为该值等于 $bitMask
.
现在假设 $flags
是 0x1110
,$bitMask
是 0x0111
。将它们组合在一起产生 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"];
在这种情况下,比较未通过测试。希望这对您有所帮助
我试图理解别人编写的函数,但我很难理解 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)
这就是你的表达式,除了交换 &
的参数(这无关紧要)。
例如,假设 $flags
是 0x1110
,$bitMask
是 0x0110
。如果您将这两个值加在一起,您将得到 0x0110
。这通过了测试,因为该值等于 $bitMask
.
现在假设 $flags
是 0x1110
,$bitMask
是 0x0111
。将它们组合在一起产生 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"];
在这种情况下,比较未通过测试。希望这对您有所帮助