在这个Bitwise运算符if语句中进行比较的内容是什么?

时间:2016-05-23 16:45:47

标签: php bitwise-operators

我正在尝试理解由其他人编写的函数,但是我很难处理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

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

2 个答案:

答案 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)

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

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

现在让我们说$flags0x1110$bitMask0x0111。将这些组合在一起产生0x0110。该值匹配$bitMask,因此测试失败。并非位掩码中的所有位都在flags变量中设置 - 即最右边的位。