当前位置: 首页 > 技术随笔 > 位运算的妙用

位运算的妙用

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

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

3 0
我们认为: 用户的主要目的,是为了获取有用的信息,而不是来点击广告的。因此本站将竭力做好内容,并将广告和内容进行分离,确保所有广告不会影响到用户的正常阅读体验。用户仅凭个人意愿和兴趣爱好点击广告。
我们坚信:只有给用户带来价值,用户才会给我们以回报。
CodePlayer技术交流群1CodePlayer技术交流群1

帮朋友打一个硬广告:

P2P网贷系统(Java版本) 新年低价大促销,多年P2P技术积累,系统功能完善(可按需定制,可支持第三方存管、银行存管),架构稳定灵活、性能优异、二次开发快速简单。 另可提供二次开发、安装部署、售后维护、安全培训等一条龙服务。

外行看热闹,内行看门道。可以自信地认为,在系统设计上,比市面上的晓风、迪蒙、方维、绿麻雀、国融信、金和盛等P2P系统要好。
深圳地区支持自带技术人员现场考察源代码、了解主要技术架构,货比三家,再决定是否购买。

也可推荐他人购买,一旦完全成交,推荐人可获得实际售价 10% 的返现。
有意向者,详情请 点击这里 联系,工作时间立即回复。