老生常谈PHP位运算的用途


Posted in PHP onMarch 12, 2017

在实际应用中可以做用户权限的应用

我这里说到的权限管理办法是一个普遍采用的方法,主要是使用到”位运行符”操作,& 位与运算符、| 位或运行符。参与运算的如果是10进制数,则会被转换至2进制数参与运算,然后计算结果会再转换为10进制数输出。

它的权限值是这样的

2^0=1,相应2进数为”0001″(在这里^我表示成”次方”,即:2的0次方,下同)

2^1=2,相应2进数为”0010″
2^2=4,相应2进数为”0100″
2^3=8,相应2进数为”1000″

要判断一个数在某些数范围内就可以使用 & 运算符(数值从上面的表中得来)

如:7=4|2|1 (你也可以简单理解成7=4+2+1)

用 & 来操作,可以知道7&4、7&2、7&1都是真的,而如果7&8则是假的

&、| 不熟悉的就要去查查手册,看看是怎么用的了

下面来看例子吧:

// 赋予权限值-->删除:8、上传:4、写入:2、只读:1
define(“mDELETE”,8);
define(“mUPLOAD”,4);
define(“mWRITE”,2);
define(“mREAD”,1);
//vvvvvvvvvvvvv使用说明vvvvvvvvvvvvv
//部门经理的权限为(假设它拥有此部门的所有权限),| 是位或运行符,不熟悉的就查查资料
echo mDELETE|mUPLOAD|mWRITE|mREAD ,”
“;// 相当于是把上面的权限值加起来:8+4+2+1=15
// 设我只有 upload 和 read 权限,则
echo mUPLOAD|mREAD ,”
“;//相当于是把上传、只读的权限值分别相加:4+1=5
/*
*赋予它多个权限就分别取得权限值相加,又比如某位员工拥有除了删除外的权限其余都拥有,那它的权限值是多少?
*应该是:4+2+1=7
*明白了怎么赋值给权限吧?
*/
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//判断某人的权限可用,设权限值在$key中
/*
*判断权限用&位与符,
*/
$key = 13;//13=8+4+1
if($key & mDELETE) echo “有删除权限
“; //8
if($key & mUPLOAD) echo “有上传权限
“; //4
$a=$key & mWRITE; echo “有写权限
“.$a; //无此权限
if($key & mREAD) echo “有读权限
“; //1
?>

OK,权限分值的这其中一个算法就是这样的,可以说是简单高效。也不知大家明白没有,不明白也没关系,记住例子就行了。前提就是做好权限值的分布,即那个1、2、4、8、16….(这里还有个顺序问题,越高级的权限就要越高的权限值,比如上面的例子所演示的删除权限)。有了权限分布表就可以确定给某个人什么权限了,你简单的理解成要哪个权限就加上相应的权限值吧。

这个方法很好用的,缺点就是如果权限分布得细的话,那么权限值会越来越大,你自己想想,2的几次方、如果所有的权限都要则是全部相加。不过对于一般的权限来说这个已经足够了。

下面是些简单应用举例

(1) 判断int型变量a是奇数还是偶数

a&1 = 0 偶数

a&1 = 1 奇数

(2) 取int型变量a的第k位 (k=0,1,2……sizeof(int)),即a>>k&1

(3) 将int型变量a的第k位清0,即a=a&~(1<

<>

(4) 将int型变量a的第k位置1, 即a=a|(1<

<>

(5) int型变量循环左移k次,即a=a<>16-k (设sizeof(int)=16)

(6) int型变量a循环右移k次,即a=a>>k|a<<16-k (设sizeof(int)=16)

(7)整数的平均值

对于两个整数x,y,如果用 (x+y)/2 求平均值,会产生溢出,因为 x+y 可能会大于INT_MAX,但是我们知道它们的平均值是肯定不会溢出的,我们用如下算法:

int average(int x, int y) //返回X,Y 的平均值

{ 

return (x&y)+((x^y)>>1);

}

(8)判断一个整数是不是2的幂,对于一个数 x >= 0,判断他是不是2的幂

boolean power2(int x)

{

return ((x&(x-1))==0)&&(x!=0);

}

(9)不用temp交换两个整数

void swap(int x , int y)

{

x ^= y;

y ^= x;

x ^= y;

}

(10)计算绝对值

int abs( int x )

{

int y ;

y = x >> 31 ;

return (x^y)-y ; //or: (x+y)^y

}

(11)取模运算转化成位运算 (在不产生溢出的情况下)

a % (2^n) 等价于 a & (2^n ? 1)

(12)乘法运算转化成位运算 (在不产生溢出的情况下)

a * (2^n) 等价于 a<< n

(13)除法运算转化成位运算 (在不产生溢出的情况下)

a / (2^n) 等价于 a>> n

例: 12/8 == 12>>3

(14) a % 2 等价于 a & 1

(15) if (x == a) x= b;

else x= a;

等价于 x= a ^ b ^ x;

(16) x 的 相反数 表示为 (~x+1)

在32位系统上不要右移超过32位,不要在结果可能超过 32 位的情况下左移

以上这篇老生常谈PHP位运算的用途就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
在PHP3中实现SESSION的功能(三)
Oct 09 PHP
PHP 导出数据到淘宝助手CSV的方法分享
Feb 27 PHP
保存到桌面、设为桌面且带图标的PHP代码
Nov 19 PHP
php实现文件下载(支持中文文名)
Dec 04 PHP
改写ThinkPHP的U方法使其路由下分页正常
Jul 02 PHP
php使用iconv中文截断问题的解决方法
Feb 11 PHP
php中define用法实例
Jul 30 PHP
Windows2003下php5.4安装配置教程(Apache2.4)
Jun 30 PHP
PHP简单获取网站百度搜索和搜狗搜索收录量的方法
Aug 23 PHP
PHP快速排序quicksort实例详解
Sep 28 PHP
PHP实现字符串大小写转函数的功能实例
Feb 06 PHP
php 函数中静态变量使用的问题实例分析
Mar 05 PHP
PHP巧妙利用位运算实现网站权限管理的方法
Mar 12 #PHP
解决PHP上传非标准格式的图片pjpeg失败的方法
Mar 12 #PHP
Yii2 加载css、js 载静态资源的方法
Mar 10 #PHP
php pdo操作数据库示例
Mar 10 #PHP
yii2简单使用less代替css示例
Mar 10 #PHP
在Mac OS下搭建LNMP开发环境的步骤详解
Mar 10 #PHP
Yii2.0中使用js异步删除示例
Mar 10 #PHP
You might like
PHP 编程请选择正确的文本编辑软件
2006/12/21 PHP
PHP Zip解压 文件在线解压缩的函数代码
2010/05/26 PHP
延长phpmyadmin登录时间的方法
2011/02/06 PHP
php下拉选项的批量操作的实现代码
2013/10/14 PHP
Win2003+apache+PHP+SqlServer2008 配置生产环境
2014/07/29 PHP
PHP获取数组中重复最多的元素的实现方法
2014/11/11 PHP
详解Yii2高级版引入bootstrap.js的一个办法
2017/03/21 PHP
PHP中使用CURL发送get/post请求上传图片批处理功能
2018/10/15 PHP
phpstudy后门rce批量利用脚本的实现
2019/12/12 PHP
jquery imgareaselect 使用利用js与程序结合实现图片剪切
2009/07/30 Javascript
jquery.lazyload  实现图片延迟加载jquery插件
2010/02/06 Javascript
javascript进行数组追加方法小结
2014/06/16 Javascript
JavaScript中使用typeof运算符需要注意的几个坑
2014/11/08 Javascript
jQuery无刷新上传之uploadify3.1简单使用
2016/06/18 Javascript
微信小程序 教程之模块化
2016/10/17 Javascript
通过jsonp获取json数据实现AJAX跨域请求
2017/01/22 Javascript
lhgcalendar时间插件限制只能选择三个月的实现方法
2017/07/03 Javascript
webpack开发跨域问题解决办法
2017/08/03 Javascript
vue服务端渲染的实例代码
2017/08/28 Javascript
Angular实现的简单查询天气预报功能示例
2017/12/27 Javascript
详解使用 Node.js 开发简单的脚手架工具
2018/06/08 Javascript
selenium 反爬虫之跳过淘宝滑块验证功能的实现代码
2020/08/27 Javascript
python写的一个squid访问日志分析的小程序
2014/09/17 Python
Python的Twisted框架上手前所必须了解的异步编程思想
2016/05/25 Python
Python数据持久化shelve模块用法分析
2018/06/29 Python
Python自定义装饰器原理与用法实例分析
2018/07/16 Python
解决Python下json.loads()中文字符出错的问题
2018/12/19 Python
python使用smtplib模块发送邮件
2020/12/17 Python
Python实现钉钉/企业微信自动打卡的示例代码
2021/02/02 Python
Mio Skincare法国官网:身体紧致及孕期身体护理
2018/04/04 全球购物
请编写一个 C 函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引值
2014/09/15 面试题
函授毕业自我鉴定
2013/12/19 职场文书
政治表现评语
2014/05/04 职场文书
安全生产专项整治方案
2014/05/06 职场文书
人身损害赔偿协议书格式
2014/11/01 职场文书
实习单位指导教师评语
2014/12/30 职场文书