位运算
就是把数值转化成二进制数来进行运算
常用的位运算符详下表:
例子 | 名称 | 结果 |
---|---|---|
$a & $b | And(按位与) | 将把 $a 和 $b 中都为 1 的位设为 1。 |
$a | $b | Or(按位或) | 将把 $a 或者 $b 中为 1 的位设为 1。 |
$a ^ $b | Xor(按位异或) | 将把 $a 和 $b 中不同的位设为 1。 |
~ $a | Not(按位非) | 将 $a 中为 0 的位设为 1,反之亦然。 |
$a << $b | Shift left(左移) | 将 $a 中的位向左移动 $b 次(每一次移动都表示“乘以 2”)。 |
$a >> $b | Shift right(右移) | 将 $a 中的位向右移动 $b 次(每一次移动都表示“除以 2”)。 |
<?php $a=12; /* 转化为二进制数为1100 */ $b=9; /* 转化为二进制数为1001 */ $c=2; echo "a=$a b=$b c=$c"; echo "<br>$a & $b ="; echo $a & $b; echo "<br>$a | $b ="; echo $a | $b; echo "<br>$a<<$c="; echo $a<<$c; ?>
优点和缺陷
位运算的运算对象是二进制的位,速度快,效率高,而且节省存储空间,位运算做权限控制又相当地灵活。
但是,位运算也有很大的局限,因为在32位计算机上,位移不能超过32次,这就要求权限数量不超过32种。
例子:
通过位运算简单实现权限控制。
<? // 赋予权限值-->删除:8、上传:4、写入:2、只读:1 define("mDELETE",8); define("mUPLOAD",4); define("mWRITE",2); define("mREAD",1); //==========使用说明================== //部门经理的权限为(假设它拥有此部门的所有权限),| 是位或运行符,不熟悉的就查查资料 echo mDELETE|mUPLOAD|mWRITE|mREAD ,"<br>";// 相当于是把上面的权限值加起来:8+4+2+1=15 // 设我只有 upload 和 read 权限,则 echo mUPLOAD|mREAD ,"<br>";//相当于是把上传、只读的权限值分别相加:4+1=5 /* *赋予它多个权限就分别取得权限值相加,又比如某位员工拥有除了删除外的权限其余都拥有,那它的权限值是多少? *应该是:4+2+1=7 *明白了怎么赋值给权限吧? */ //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //判断某人的权限可用,设权限值在$key中 /* *判断权限用&位与符, */ #$key = 15;//13=8+4+1 $key = mDELETE|mUPLOAD|mWRITE|mREAD; echo $key & mDELETE; if($key & mDELETE) echo "有删除权限<br>"; //8 if($key & mUPLOAD) echo "有上传权限<br>"; //4 if($key & mWRITE) echo "有写权限<br>"; //无此权限 if($key & mREAD) echo "有读权限<br>"; //1 #取消某个权限 $key = $key ^ mDELETE; echo '-----------------------------'; if($key & mDELETE) echo "有删除权限<br>"; //8 if($key & mDELETE) echo "有删除权限<br>"; //8 if($key & mUPLOAD) echo "有上传权限<br>"; //4 if($key & mWRITE) echo "有写权限<br>"; //无此权限 if($key & mREAD) echo "有读权限<br>"; //1 ?>继续
<? // 赋予权限值-->删除:8、上传:4、写入:2、只读:1 define("mDELETE",8); define("mUPLOAD",4); define("mWRITE",2); define("mREAD",1); //==========使用说明================== //部门经理的权限为(假设它拥有此部门的所有权限),| 是位或运行符,不熟悉的就查查资料 echo mDELETE|mUPLOAD|mWRITE|mREAD ,"<br>";// 相当于是把上面的权限值加起来:8+4+2+1=15 // 设我只有 upload 和 read 权限,则 echo mUPLOAD|mREAD ,"<br>";//相当于是把上传、只读的权限值分别相加:4+1=5 /* *赋予它多个权限就分别取得权限值相加,又比如某位员工拥有除了删除外的权限其余都拥有,那它的权限值是多少? *应该是:4+2+1=7 *明白了怎么赋值给权限吧? */ //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //判断某人的权限可用,设权限值在$key中 /* *判断权限用&位与符, */ #$key = 15;//13=8+4+1 $key = mDELETE|mUPLOAD|mWRITE|mREAD; echo $key & mDELETE; if($key & mDELETE) echo "有删除权限<br>"; //8 if($key & mUPLOAD) echo "有上传权限<br>"; //4 if($key & mWRITE) echo "有写权限<br>"; //无此权限 if($key & mREAD) echo "有读权限<br>"; //1 #取消某个权限 $key = $key ^ mDELETE; echo '-----------------------------'; if($key & mDELETE) echo "有删除权限<br>"; //8 if($key & mDELETE) echo "有删除权限<br>"; //8 if($key & mUPLOAD) echo "有上传权限<br>"; //4 if($key & mWRITE) echo "有写权限<br>"; //无此权限 if($key & mREAD) echo "有读权限<br>"; //1 ?>
转载请注明:半叶寒羽
» php位运算及实现权限控制