老生常谈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 相关文章推荐
PHP脚本的10个技巧(7)
Oct 09 PHP
PHP中利用substr_replace将指定两位置之间的字符替换为*号
Jan 27 PHP
PHP中SESSION使用中的一点经验总结
Mar 30 PHP
深入mysql_fetch_row()与mysql_fetch_array()的区别详解
Jun 05 PHP
php全局变量和类配合使用深刻理解
Jun 05 PHP
PHP 如何获取二维数组中某个key的集合
Jun 03 PHP
PHP数据库万能引擎类adodb配置使用以及实例集锦
Jun 12 PHP
php使用Jpgraph绘制简单X-Y坐标图的方法
Jun 10 PHP
php商品对比功能代码分享
Sep 24 PHP
PHP时间戳格式全部汇总 (获取时间、时间戳)
Jun 13 PHP
PHP使用imagick扩展实现合并图像的方法
Apr 25 PHP
解决Laravel 使用insert插入数据,字段created_at为0000的问题
Oct 11 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
单位速度在实战中的运用
2020/03/04 星际争霸
Laravel 中获取上一篇和下一篇数据
2015/07/27 PHP
谈谈从phpinfo中能获取哪些值得注意的信息
2017/03/28 PHP
NiftyCube——轻松实现圆角边框
2007/02/20 Javascript
JavaScript中的无阻塞加载性能优化方案
2014/10/10 Javascript
初始Nodejs
2014/11/08 NodeJs
JavaScript中Cookies的相关使用教程
2015/06/04 Javascript
jQuery弹出下拉列表插件(实现kindeditor的@功能)
2016/08/16 Javascript
浅谈js获取ModelAndView值的问题
2018/03/28 Javascript
chosen实现省市区三级联动
2018/08/16 Javascript
vue 弹框产生的滚动穿透问题的解决
2018/09/21 Javascript
基于js实现数组相邻元素上移下移
2020/05/19 Javascript
AngularJs的$http发送POST请求,php无法接收Post的数据问题及解决方案
2020/08/13 Javascript
npm全局环境变量配置详解
2020/12/15 Javascript
[54:47]Liquid vs VP Supermajor决赛 BO 第五场 6.10
2018/07/05 DOTA
Python的自动化部署模块Fabric的安装及使用指南
2016/01/19 Python
实践Python的爬虫框架Scrapy来抓取豆瓣电影TOP250
2016/01/20 Python
浅析Python中元祖、列表和字典的区别
2016/08/17 Python
一个简单的python爬虫程序 爬取豆瓣热度Top100以内的电影信息
2018/04/17 Python
flask入门之表单的实现
2018/07/18 Python
Python3.5面向对象程序设计之类的继承和多态详解
2019/04/24 Python
Python+AutoIt实现界面工具开发过程详解
2019/08/07 Python
手把手教你安装Windows版本的Tensorflow
2020/03/26 Python
Python flask框架实现浏览器点击自定义跳转页面
2020/06/04 Python
Daisy London官网:英国最大的首饰集团IBB旗下
2019/02/28 全球购物
英国独特家具和家庭用品购物网站:Cuckooland
2020/08/30 全球购物
存储过程和sql语句的优缺点
2014/07/02 面试题
2014全国两会心得体会
2014/03/17 职场文书
室内设计专业毕业生求职信
2014/05/02 职场文书
2014年电工工作总结
2014/11/20 职场文书
法律进社区活动总结
2015/05/07 职场文书
入学证明
2015/06/23 职场文书
女性健康讲座主持词
2015/07/04 职场文书
2019年汽车租赁合同范本!
2019/08/12 职场文书
java协程框架quasar和kotlin中的协程对比分析
2022/02/24 Java/Android
PostgreSQL常用字符串分割函数整理汇总
2022/07/07 PostgreSQL