您的浏览器过于古老 & 陈旧。为了更好的访问体验, 请 升级你的浏览器
Ready 发布于2013年09月03日 12:35

原创 位运算的妙用

1841 次浏览 读完需要≈ 6 分钟

内容目录

在前面的文章《计算机二进制以及原码、反码、补码入门详解》和《位运算入门详解》中,我们详细介绍了计算机二进制以及位运算的相关基础知识。现在,我们可以使用位运算来完成一些比较巧妙的功能设计或实现。

现在,某个数据库系统中有增(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的错误报告级别。

  • CodePlayer技术交流群1
  • CodePlayer技术交流群2

0 条评论

撰写评论