我正在尝试理解由其他人编写的函数,但是我很难处理for循环中的第二个if语句。有人可以解释这里的逻辑吗?实际比较的是什么?
表CMS_ROLE的数据包含以下列:ID,ROLE_MASK,ROLE_KEY。两者都是varchar(100)。 ROLE_MASK是标题,例如manager,author,admin等.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
-----------------
答案 0 :(得分:1)
下面是按位运算符如何工作的简单解释,它应该可以帮助您理解程序员打算做什么
假设变量的值如下:
案例1:
class RealmUser: Object {
dynamic var userId = 0
dynamic var name = ""
...
convenience init(withUser user: User) {
self.init()
userId = user.id
name = user.name
...
}
}
表示if语句:
$roleMask = 5;
$role["ROLE_MASK"] = 5;
条件:
if ((intval($roleMask) & intval($role["ROLE_MASK"])) == intval($roleMask)) $roleKeys[] = $role["ROLE_KEY"];
解决方法如下:
((intval($roleMask) & intval($role["ROLE_MASK"]) == intval($roleMask))
然后将101逐比特地比较101 按位AND遵循以下规则:
5 in binary = 101
这给出了:
1 compared to 1 = 1
1 compared to 0 = 0
0 compared to 0 = 0
0 compared to 1 = 0
十进制的101是5,所以
1 compared to 1 = 1
0 compared to 0 = 0
1 compared to 1 = 1
if语句变为
(5 & 5) = 5
解析为
if ((5 & 5) == 5) $roleKeys[] = $role["ROLE_KEY"];
案例2:
if (5 == 5) $roleKeys[] = $role["ROLE_KEY"];
表示if语句:
$roleMask = 6;
$role["ROLE_MASK"] = 7;
条件:
if ((intval($roleMask) & intval($role["ROLE_MASK"])) == intval($roleMask)) $roleKeys[] = $role["ROLE_KEY"];
解决方法如下:
((intval($roleMask) & intval($role["ROLE_MASK"]) == intval($roleMask))
然后将110比较为111比特 遵循与上述相同的规则,这给出了:
6 in binary = 110
7 in binary = 111
十进制的110是6,所以
1 compared to 1 = 1
1 compared to 1 = 1
0 compared to 1 = 0
if语句变为
(6 & 7) = 6
解析为
if ((6 & 7) == 6) $roleKeys[] = $role["ROLE_KEY"];
案例3:
if (6 == 6) $roleKeys[] = $role["ROLE_KEY"];
表示if语句:
$roleMask = 7;
$role["ROLE_MASK"] = 4;
条件:
if ((intval($roleMask) & intval($role["ROLE_MASK"])) == intval($roleMask)) $roleKeys[] = $role["ROLE_KEY"];
解决方法如下:
((intval($roleMask) & intval($role["ROLE_MASK"]) == intval($roleMask))
然后将111比较为100比特 遵循与上述相同的规则,这给出了:
7 in binary = 111
4 in binary = 100
十进制的100是4,所以
1 compared to 1 = 1
1 compared to 0 = 0
1 compared to 0 = 0
if语句变为
(7 & 4) = 4
解析为
if ((7 & 4) == 7) $roleKeys[] = $role["ROLE_KEY"];
在这种情况下,比较未通过测试..希望这有帮助
答案 1 :(得分:0)
如果你有一组标志$flags
和一个位掩码$bitMask
,检查位掩码中所有位是否都设置的方法是:
if (($flags & $bitMask) == $bitMask)
这是你的表达,除了&
交换的参数(无关紧要)。
例如,假设$flags
为0x1110
而$bitMask
为0x0110
。如果你和这两个值一起得到0x0110
。这通过了测试,因为该值等于$bitMask
。
现在让我们说$flags
是0x1110
而$bitMask
是0x0111
。将这些组合在一起产生0x0110
。该值不匹配$bitMask
,因此测试失败。并非位掩码中的所有位都在flags变量中设置 - 即最右边的位。