常见的位运算
运算符号 | 意义 | 运算对象类型 | 运算结果类型 | 实例 |
~ | 非运算 | 整型、字符串 | 整型 | ~a |
& | 与运算 | 整型、字符串 | 整型 | a&b |
| | 或运算 | 整型、字符串 | 整型 | a|b |
^ | 异或运算 | 整型、字符串 | 整型 | a^b |
<< | 位左移运算 | 整型、字符串 | 整型 | a<<2 |
>> | 位右移运算 | 整型、字符串 | 整型 | b>>2 |
权限管理办法是一个普遍采用的方法,主要是使用到"位运行符"操作,& 位与运算符、| 位或运行符。参与运算的如果是10进制数,则会被转换至2进制数参与运算,然后计算结果会再转换为10进制数输出。
添加权限使用或
判断权限使用与
去掉权限用异或
举例:
<?php
//赋予权限值-->删除:8、上传:4、写入:2、只读:1
define("mDELETE",8);
define("mUPLOAD",4);
define("mWRITE",2);
define("mREAD",1);
//部门经理,拥有所有权限
echo mDELETE | mUPLOAD | mWRITE | mREAD //相当于 8 + 4 + 2 + 1 = 15
//判断权限
if($key & mDELETE){
echo '有删除权限<br>';
}
else{
echo '无删除权限<br>';
}
if($key & mUPLOAD){
echo '有上传权限<br>';
}
else{
echo '无上传权限<br>';
}
if($key & mWRITE){
echo '有写权限<br>';
}
else{
echo '无写权限<br>';
}
if($key & mREAD){
echo '有读权限<br>';
}
else{
echo '无读权限<br>';
}
//删除权限
$nkey = $key ^ mUPLOAD;
echo '删除上传权限后<br>';
echo "key=$nkey<br>";
if($nkey & mUPLOAD){
echo '有上传权限<br>';
}
else{
echo '无上传权限<br>';
}
1. 为什么常量都是2的幂次,而不是随便的整数:保证一位一权限.方便与或等操作.这是使用位表示权限的前提。
2. 与运算之后移位的原因 :因为与操作后, 右边还出现有其他0,通过移位,结果就是0或1,能简化判断。注意移位与初始值时的移位一样。
3.有几位就可以表示几种权限,32位可以表示32种权限。
做好权限值的分布,即那个1、2、4、8、16....(这里还有个顺序问题,越高级的权限就要越高的权限值,比如上面的例子所演示的删除权限)。有了权限分布表就可以确定给某个人什么权限了,你简单的理解成要哪个权限就加上相应的权限值吧。
这个方法很好用的,缺点就是如果权限分布得细的话,那么权限值会越来越大,你自己想想,2的几次方、如果所有的权限都要则是全部相加。不过对于一般的权限来说这个已经足够了。