`
天梯梦
  • 浏览: 13612534 次
  • 性别: Icon_minigender_2
  • 来自: 洛杉矶
社区版块
存档分类
最新评论

php 位运算

 
阅读更多

原理

在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;				
?>

 

预览:

位运算符 php运算符

 

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位运算的用途

    下面小编就为大家带来一篇老生常谈PHP位运算的用途。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    浅析关于PHP位运算的简单权限设计

    关于二进制数的位运算,常见的就是“或、与、非”这三种简单运算了,当然,我也查看了下PHP手册,还有“异或、左移、右移”这三个运算。记得上初中时数学老师就开始唠叨个不停了,在此我也不想对此运算再作额外的...

    PHP巧妙利用位运算实现网站权限管理的方法

    首先我们先定义4个常量来设定四种权限: ===================================== ...A用户拥有ADD-UPD-SEL-DEL四个权限,用位或运算计算A的权限总值 $a_all=ADD|UPD|SEL|DEL;//$all=15 可以注意到这个值

    php实现小学四则运算

    本函数用php实现小学四则运算及其四则运算,通过调用本函数,自动产生个算术使及其结果,以数组的形式返回,算术式参与运算的数字个数可自定义,运算符号随机产生。此外本函数对结果限制不出现负数,不出现小数,不...

    php四则运算出题器

    1.可以将出题结果导出到EXCEL文件 2.用户可以指定题目的数量 3.用户可指定操作数的数目(至少二个、至多四个),如果指定的操作数超过2个,应该...7.用户可以指定除法运算结果有余数还是保留小数点位数(只实现了2位的)

    计算机后端-PHP视频教程. php与mysql加强- 05. php加强51-位运算.wmv

    计算机后端-PHP视频教程. php与mysql加强- 05. php加强51-位运算.wmv

    PHP实现四则运算计算器

    PHP实现四则运算计算器 一、实验环境 1、环境搭建:Windows 8+Apache 2.4.18+MySQL 5.7.11+PHP 7.1.0 。 2、文本编辑器:Sublime Text3。 二、主要技术 本实验使用PHP 7、HTML和JavaScript实现简单的四则运算...

    php四则运算计算函数

    代码中包含通过逆波兰式php实现的计算四则运算表达式的方法,比如计算(103*(12/321+7)+3)*45的结果,网上常用的四则运算函数或者不能支持多位运算,或者不能支持括号,或者只有逆波兰式的实现。

    PHP 使用位运算实现四则运算的代码

    这次尝试在 PHP 中使用位运算实现四则运算,首先介绍一些基本概念: 原码:将最高位作为符号位(0表示正,1表示负),其它数字位代表数值本身的绝对值 反码:正数反码和原码一样;如果是负数,符号位不变,其余各位...

    JS通过位运算实现权限加解密

    主要介绍了JS通过位运算实现权限加解密的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧

    韩顺平位运算

    适合初学者认识位运算,更好的学好位运算,认识到位运算

    四则运算.php

    四则运算.php

    PHP100视频教程03:常用PHP运算类型介绍与应用

    PHP100视频教程03:常用PHP运算类型介绍与应用

    PHP100视频教程 3:常用PHP运算类型介绍与应用.rar

    软件介绍 PHP100视频教程 3 之 常用PHP运算类型介绍与应用 1、算术运算 2、赋值运算 3、比较运算 4、逻辑运算 5、递增递减运算 视频长达27分钟,语言清晰易懂,配PPT课件,是初学者的好教程。

    PHP数学运算与数据处理实例分析_.docx

    PHP数学运算与数据处理实例分析_.docx

Global site tag (gtag.js) - Google Analytics