- 浏览: 13612534 次
- 性别:
- 来自: 洛杉矶
文章分类
- 全部博客 (1994)
- Php / Pear / Mysql / Node.js (378)
- Javascript /Jquery / Bootstrap / Web (435)
- Phone / IOS / Objective-C / Swift (137)
- Ubuntu / Mac / Github / Aptana / Nginx / Shell / Linux (335)
- Perl / Koha / Ruby / Markdown (8)
- Java / Jsp (12)
- Python 2 / Wxpython (25)
- Codeigniter / CakePHP (32)
- Div / Css / XML / HTML5 (179)
- WP / Joomla! / Magento / Shopify / Drupal / Moodle / Zimbra (275)
- Apache / VPN / Software (31)
- AS3.0/2.0 / Flex / Flash (45)
- Smarty (6)
- SEO (24)
- Google / Facebook / Pinterest / SNS (80)
- Tools (22)
最新评论
-
1455975567:
xuezhongyu01 写道wocan23 写道我想问下那个 ...
Mysql: LBS实现查找附近的人 (两经纬度之间的距离) -
xuezhongyu01:
wocan23 写道我想问下那个111.1是怎么得来的我也看不 ...
Mysql: LBS实现查找附近的人 (两经纬度之间的距离) -
18335864773:
试试 pageoffice 在线打开 PDF 文件吧. pag ...
jquery在线预览PDF文件,打开PDF文件 -
青春依旧:
opacity: 0.5; 个人喜欢这种方式!关于其他css特 ...
css透明度的设置 (兼容所有浏览器) -
July01:
推荐用StratoIO打印控件,浏览器和系统的兼容性都很好,而 ...
搞定网页打印自动分页问题
原理
在Linux文件系统中,一个用户对文件或目录所拥有的权限分为三种:”可读”、”可写”和”可执行”,分别用 1 、2 和 4 来表示,它们之间可以任意组合:有“可读”、“可写”权限就用 3 来表示(1 + 2 = 3);有”可读“、”可执行“权限就用5来表示(1 + 4 = 5),三种权限全部拥有就用 7 表示(1 + 2 + 4 = 7)。
实际上,这种运算是基于二进制的。假设可执行、可写、可读三种权限分别对应三个状态位,如果用户具有某种权限,那么将对应的状态位标识为“1”,反之则标识为“0”。如图:
如果只有“可读”权限,那么就对应二进制数:001,将这个二进制数转成十进制就得到1;如果同时具有“可读”、“可写”权限,二进制数则对应为: 011,转十进制得:3;同理,三种权限都有的,十进制就等于7。
实现
在PHP中,通过位运算符 很容易就可以做到类似的权限控制:
<?php //定义权限 define('READ', 1<< 0); // 把可读权限放在最右边 define('WRITE', 1<<1); // 可读权限向左移一位 define('EXCUTE', 1<<2); // 可执行权限向左移两位 //赋予权限 $user_permission = READ | WRITE; //验证权限 echo '可读:', ($user_permission & READ) ? 'Yes' : 'No', "\n"; echo '可写:', ($user_permission & WRITE) ? 'Yes' : 'No', "\n"; echo '可执行:', ($user_permission & EXCUTE) ? 'Yes' : 'No', "\n"; ?>
PHP语言本身的错误控制 也是用位运算来做的,它甚至还利用了按位异或 和按位非 ,使得错误控制更加精确。
优点和缺陷
位运算的运算对象是二进制的位,速度快,效率高,而且节省存储空间,位运算做权限控制又相当地灵活。但是,位运算也有很大的局限,因为在32位计算机上,位移不能超过32次,这就要求权限数量不超过32种。
来源:http://xiaobin.net/200906/bitwise-permission/
位运算 就是把数值转化成二进制数来进行运算,常用的位运算符详下表:
$a & $b | And(按位与) | 将把 $a 和 $b 中都为 1 的位设为 1。 |
$a | $b | Or(按位或) | 将把 $a 或者 $b 中为 1 的位设为 1。 |
$a ^ $b | Xor(按位异或) | 将把 $a 和 $b 中不同的位设为 1。 |
~ $a | Not(按位非) | 将 $a 中为 0 的位设为 1,反之亦然。 |
$a << $b | Shift left(左移) | 将 $a 中的位向左移动 $b 次(每一次移动都表示“乘以 2”)。 |
$a >> $b | Shift right(右移) | 将 $a 中的位向右移动 $b 次(每一次移动都表示“除以 2”)。 |
<?php $a=12; /* 转化为二进制数为1100 */ $b=9; /* 转化为二进制数为1001 */ $c=2; echo "a=$a b=$b c=$c"; echo "<br>$a & $b ="; echo $a & $b; echo "<br>$a | $b ="; echo $a | $b; echo "<br>$a<<$c="; echo $a<<$c; ?>
预览:
ps:用十进制数除以2得余数,继续除每次都是取余数,所得的是从低位到高位的二进制数。
如:12/2=6 (余数0) 6/2=3(余数0) 3/2=1(余数1) 1/2=1(余数1)
即:1100。
二进制转换成十进制,分别用每一位的数字×对应的2的不同次幂。
1100即 20 x0+21 x0+22 x1=23 x1=12
来源: http://www.web589.com/posts/575.html
原理: 将每个二进制位为一个权限标识位
- 增加权限使用 | (无论存在与否, 将对应的权限位置1)
- 删除权限使用 ^ 或 & ~ (无论存在与否, 将对应的权限位置0)
- 判断权限使用 & (使用与判断对应的权限位是否为1, 是, 返回非0; 不是, 返回0)
<?php define("PUBLIC_ARTICLE", 1); //发行文章 define("CREATE_ARTICLE", 2); //添加文章 define("MODIFY_ARTICLE", 4); //修改文章 define("DELETE_ARTICLE", 8); //删除文章 define("SHARCH_ARTICLE", 16); //搜索文章 define("CREATE_COMMENT", 32); //添加文章评论 define("DELETE_COMMENT", 64); //删除文章评论 //所有的权限 $final_allow = PUBLIC_ARTICLE | CREATE_ARTICLE | MODIFY_ARTICLE | DELETE_ARTICLE | SHARCH_ARTICLE | CREATE_COMMENT | DELETE_COMMENT; echo "管理者拥有的全部权限:" .decbin($final_allow). "<br>"; $no_shearch_allow = $final_allow ^ SHARCH_ARTICLE; echo "仅无法搜索文章的权限:" .decbin($no_shearch_allow). "<br>"; //编辑人员独有的权限 $editor_allow = PUBLIC_ARTICLE | MODIFY_ARTICLE | DELETE_ARTICLE; $no_editor_allow = $final_allow & ~$editor_allow; echo "非编辑人员所有的权限:" .decbin($no_editor_allow). "<br>"; ?>
最终输出为:
管理者拥有的全部权限:1111111
仅无法搜索文章的权限:1101111
非编辑人员所有的权限:1110010
另外可以参看:
<?php echo $uu=array_sum($_POST[gr]); ?> <form action="" method="POST"> ADD <input type="checkbox" name=gr[] value=1 <?php echo $uu&1? "checked":null;?>> UPD <input type="checkbox" name=gr[] value=2 <?php echo $uu&2? "checked":null;?>> LIS <input type="checkbox" name=gr[] value=4 <?php echo $uu&4? "checked":null;?>> DEL <input type="checkbox" name=gr[] value=8 <?php echo $uu&8? "checked":null;?>> <input type="submit" value="提交"> </form> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
发表评论
-
PHP: 在类(class)中加载动态函数, 变量函数或半变量函数 variable function/method
2016-09-03 07:54 7079最终实例在下方 以前 ... -
MySQL入门 (七) : 储存引擎与资料型态
2016-09-03 07:49 44901 表格与储存引擎 表格(table)是资料库中用来储存 ... -
MySQL入门 (六) : 字元集与资料库
2016-09-03 07:47 44861 Character Set与Collation 任何 ... -
MySQL入门 (五) : CRUD 与资料维护
2016-09-03 07:46 54061 取得表格资讯 1.1 DESCRIBE指令 「 ... -
MySQL入门 (四) : JOIN 与UNION 查询
2016-09-03 07:42 44251 使用多个表格 在「world」资料库的「countr ... -
PHP: 关键字global 和 超全局变量$GLOBALS的用法、解释、区别
2016-08-31 12:07 4965$GLOBALS 是一个关联数组,每一个变量为一个 ... -
MySQL入门 (三) : 运算式与函式
2016-08-31 12:01 4313运算式(expressions)已经 ... -
MySQL入门 (二) : SELECT 基础查询
2016-08-31 11:56 46181 查询资料前的基本概念 1.1 表格、纪录 ... -
MySQL入门 (一) : 资料库概论与MySQL的安装
2016-08-31 11:51 43801. 储存与管理资料 储存与管理资料一直是资讯应用上最基本 ... -
MySQL入门 (九) : 子查询 Subquery
2016-08-30 02:26 43851 一个叙述中的查询叙述 子查询(subquery)是一 ... -
PHP: 用readonly取代disabled来获取input值 submit a disabled input in a form could not ge
2016-08-30 02:21 2636The form is like below; <f ... -
PHP7革新与性能优化
2016-08-30 02:20 2083有幸参与2015年的PHP技 ... -
Mysql: 图解 inner join、left join、right join、full outer join、union、union all的区别
2016-08-18 06:03 3051对于SQL的Join,在学习起来可能是比较乱的。我们知道, ... -
Comet 反Ajax: 基于jQuery与PHP实现Ajax长轮询(LongPoll)
2016-08-18 06:00 1314传统的AJAX轮询方式,客服端以用户定义的时间间隔去服务器上 ... -
PHP:ServerPush (Comet推送) 技术的探讨
2016-08-18 05:58 980PHP中Push(推送)技术的探讨 [http://vi ... -
PHP: 手把手编写自己的 MVC 框架实例教程
2016-08-16 05:33 17521 什么是MVC MVC模式(Model-View-Con ... -
PHP5: mysqli 插入, 查询, 更新和删除 Insert Update Delete Using mysqli (CRUD)
2016-07-29 12:55 1688原文: PHP5: mysqli 插入, 查询, 更新 ... -
MongoDB 教程索引 (附有视频)
2016-07-27 10:54 682MongoDB 教程索引 MongoDB 教程一: ... -
Node.js 模块之Nimble流程控制
2016-07-18 12:59 1024NodeJS异步的特性有时候 ... -
Node.js web应用模块之Supervisor
2016-07-18 12:56 2271在开发或调试Node.js应 ...
相关推荐
下面小编就为大家带来一篇老生常谈PHP位运算的用途。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
关于二进制数的位运算,常见的就是“或、与、非”这三种简单运算了,当然,我也查看了下PHP手册,还有“异或、左移、右移”这三个运算。记得上初中时数学老师就开始唠叨个不停了,在此我也不想对此运算再作额外的...
首先我们先定义4个常量来设定四种权限: ===================================== ...A用户拥有ADD-UPD-SEL-DEL四个权限,用位或运算计算A的权限总值 $a_all=ADD|UPD|SEL|DEL;//$all=15 可以注意到这个值
本函数用php实现小学四则运算及其四则运算,通过调用本函数,自动产生个算术使及其结果,以数组的形式返回,算术式参与运算的数字个数可自定义,运算符号随机产生。此外本函数对结果限制不出现负数,不出现小数,不...
1.可以将出题结果导出到EXCEL文件 2.用户可以指定题目的数量 3.用户可指定操作数的数目(至少二个、至多四个),如果指定的操作数超过2个,应该...7.用户可以指定除法运算结果有余数还是保留小数点位数(只实现了2位的)
计算机后端-PHP视频教程. php与mysql加强- 05. php加强51-位运算.wmv
PHP实现四则运算计算器 一、实验环境 1、环境搭建:Windows 8+Apache 2.4.18+MySQL 5.7.11+PHP 7.1.0 。 2、文本编辑器:Sublime Text3。 二、主要技术 本实验使用PHP 7、HTML和JavaScript实现简单的四则运算...
代码中包含通过逆波兰式php实现的计算四则运算表达式的方法,比如计算(103*(12/321+7)+3)*45的结果,网上常用的四则运算函数或者不能支持多位运算,或者不能支持括号,或者只有逆波兰式的实现。
这次尝试在 PHP 中使用位运算实现四则运算,首先介绍一些基本概念: 原码:将最高位作为符号位(0表示正,1表示负),其它数字位代表数值本身的绝对值 反码:正数反码和原码一样;如果是负数,符号位不变,其余各位...
主要介绍了JS通过位运算实现权限加解密的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
适合初学者认识位运算,更好的学好位运算,认识到位运算
四则运算.php
PHP100视频教程03:常用PHP运算类型介绍与应用
软件介绍 PHP100视频教程 3 之 常用PHP运算类型介绍与应用 1、算术运算 2、赋值运算 3、比较运算 4、逻辑运算 5、递增递减运算 视频长达27分钟,语言清晰易懂,配PPT课件,是初学者的好教程。
PHP数学运算与数据处理实例分析_.docx