内容目录
在前面的文章《计算机二进制以及原码、反码、补码入门详解》和《位运算入门详解》中,我们详细介绍了计算机二进制以及位运算的相关基础知识。现在,我们可以使用位运算来完成一些比较巧妙的功能设计或实现。
现在,某个数据库系统中有增(INSERT)、删(DELETE)、改(UPDATE)、查(SELECT)4种操作,现在需要为该系统添加角色权限控制功能,只有具备指定的权限才能执行对应的操作。
从上述需求我们可以得知,我们需要可以给用户分配增删改查4种权限的随意组合权限,在执行相应操作时,需要先判断是否具备对应的权限。这个时候,我们可以利用位运算来巧妙地完成该功能。
由于一个位上的数字符号有1和0两种,因此我们可以将一个独立的位看作是一个权限,位上的数字就是对应权限的开关,如果位上的数字为1,则表示具备该权限,位上的数字为0,则表示不具备该权限。那么,我们可以整理得出如下结果:
二进制数的右侧第1位表示INSERT,则
INSERT=0000 0001(二进制) = 1(十进制)
二进制数的右侧第2位表示UPDATE,则
UPDATE=0000 0010(二进制) = 2(十进制)
同样的:
DELETE=0000 0100(二进制) = 4(十进制)
SELECT=0000 1000(二进制) = 8(十进制)
在上面的整理结果中,我们使用不同的位表示不同的权限,对应的权限位上的数字为1则表示具备该权限,这样我们就可以利用位运算中的"&"、"|"、"^"等运算符来实现上述功能要求,并且由于位运算具有极高的运行效率的缘故,我们的整个功能实现也具备了较高的运行性能。
以下是详细的实现代码:
<?php
//设置编码为UTF-8,以避免中文乱码
header('Content-Type:text/html;charset=utf-8');
define('INSERT', 1); //插入=1,8位二进制0000 0001
define('UPDATE', 1 << 1); //更新=2,8位二进制0000 0010
define('DELETE', 1 << 2); //删除=4,8位二进制0000 0100
define('SELECT', 1 << 3); //查询=8,8位二进制0000 1000
define('ALL', (1 << 4) -1); //所有=15,8位二进制0001 1111
//插入
function insert($permission){
if (($permission & INSERT) > 0){
echo '执行INSERT...<br/>';
}else{
echo '你没有权限执行INSERT操作 <br/>';
}
}
//更新
function update($permission){
if (($permission & UPDATE) > 0){
echo '执行UPDATE...<br/>';
}else{
echo '你没有权限执行UPDATE操作 <br/>';
}
}
//删除
function delete($permission){
if (($permission & DELETE) > 0){
echo '执行DELETE...<br/>';
}else{
echo '你没有权限执行DELETE操作 <br/>';
}
}
//查询
function select($permission){
if (($permission & SELECT) > 0){
echo '执行SELECT...<br/>';
}else{
echo '你没有权限执行SELECT操作 <br/>';
}
}
//=====测试=====
$p = INSERT | DELETE; //插入和删除权限
insert($p);
update($p);
delete($p);
select($p);
echo '==========<br/>';
$p = ALL ^ SELECT; //除了SELECT外的所有权限
insert($p);
update($p);
delete($p);
select($p);
?>
上述PHP的运行页面显示如下:
执行INSERT...
你没有权限执行UPDATE操作
执行DELETE...
你没有权限执行SELECT操作
==========
执行INSERT...
执行UPDATE...
执行DELETE...
你没有权限执行SELECT操作
巧妙利用位运算来实现类似上述的组合配置,这种做法在许多计算机编程语言的核心代码实现中非常普遍。例如,PHP的函数error_reporting()
就是采用上述方法来设置PHP的错误报告级别。
0 条评论
撰写评论