<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>将之典藏 &#187; PHP</title>
	<atom:link href="http://xiaobin.net/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://xiaobin.net</link>
	<description>一个社交恐惧症患者（俗称：宅男）的互联网从业生活</description>
	<lastBuildDate>Mon, 05 Jul 2010 03:12:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>基于位运算的权限控制</title>
		<link>http://xiaobin.net/200906/bitwise-permission/</link>
		<comments>http://xiaobin.net/200906/bitwise-permission/#comments</comments>
		<pubDate>Fri, 05 Jun 2009 02:48:26 +0000</pubDate>
		<dc:creator>肖斌</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[位运算]]></category>

		<guid isPermaLink="false">http://blog.amumu.com/?p=22</guid>
		<description><![CDATA[原理 在Linux文件系统中，一个用户对文件或目录所拥有的权限分为三种：&#8221;可读&#8221;、&#8221;可写&#8221;和&#8221;可执行&#8221;，分别用 1 、2 和 4 来表示，它们之间可以任意组合：有“可读”、“可写”权限就用 3 来表示（1 + 2 = 3）；有”可读“、”可执行“权限就用5来表示（1 + 4 = 5），三种权限全部拥有就用 7 表示（1 + 2 + 4 = 7）。 实际上，这种运算是基于二进制的。 假设可执行、可写、可读三种权限分别对应三个状态位，如果用户具有某种权限，那么将对应的状态位标识为“1”，反之则标识为“0”。如图： 如果只有“可读”权限，那么就对应二进制数：001，将这个二进制数转成十进制就得到1；如果同时具有“可读”、“可写”权限，二进制数则对应为： 011，转十进制得：3；同理，三种权限都有的，十进制就等于7。 实现 在PHP中，通过位运算符很容易就可以做到类似的权限控制： &#60;?php //定义权限 define('READ', 1&#60;&#60; 0); // 把可读权限放在最右边 define('WRITE', 1&#60;&#60;1); // 可读权限向左移一位 define('EXCUTE', 1&#60;&#60;2); // 可执行权限向左移两位 //赋予权限 $user_permission = READ &#124; WRITE; //验证权限 echo '可读：', [...]]]></description>
			<content:encoded><![CDATA[<h3>原理</h3>
<p>在Linux文件系统中，一个用户对文件或目录所拥有的权限分为三种：&#8221;可读&#8221;、&#8221;可写&#8221;和&#8221;可执行&#8221;，分别用 1 、2 和 4 来表示，它们之间可以任意组合：有“可读”、“可写”权限就用 3 来表示（1 + 2 = 3）；有”可读“、”可执行“权限就用5来表示（1 + 4 = 5），三种权限全部拥有就用 7 表示（1 + 2 + 4 = 7）。</p>
<p>实际上，这种运算是基于二进制的。<span id="more-22"></span></p>
<p>假设可执行、可写、可读三种权限分别对应三个状态位，如果用户具有某种权限，那么将对应的状态位标识为“1”，反之则标识为“0”。如图：</p>
<p><img class="aligncenter size-full wp-image-32" title="位运算与权限控制" src="http://big5.cc/i/xbin/2009/09/2442391910.png" alt="位运算与权限控制" width="231" height="180" /></p>
<p style="text-align: center;">
<p>如果只有“可读”权限，那么就对应二进制数：001，将这个二进制数转成十进制就得到1；如果同时具有“可读”、“可写”权限，二进制数则对应为： 011，转十进制得：3；同理，三种权限都有的，十进制就等于7。</p>
<h3>实现</h3>
<p>在PHP中，通过<a href="http://www.php.net/language.operators.bitwise" target="_blank">位运算符</a>很容易就可以做到类似的权限控制：</p>
<pre>&lt;?php
//定义权限
define('READ', 1&lt;&lt; 0);    // 把可读权限放在最右边
define('WRITE', 1&lt;&lt;1);    // 可读权限向左移一位
define('EXCUTE', 1&lt;&lt;2);   // 可执行权限向左移两位

//赋予权限
$user_permission = READ | WRITE;

//验证权限
echo '可读：', ($user_permission &amp; READ) ? 'Yes' : 'No', "\n";
echo '可写：', ($user_permission &amp; WRITE) ? 'Yes' : 'No', "\n";
echo '可执行：', ($user_permission &amp; EXCUTE) ? 'Yes' : 'No', "\n";
?&gt;</pre>
<p>PHP语言本身的<a href="http://www.php.net/error_reporting" target="_blank">错误控制</a> 也是用位运算来做的，它甚至还利用了<em>按位异或</em>和<em>按位非</em>，使得错误控制更加精确。</p>
<h3>优点和缺陷</h3>
<p>位运算的运算对象是二进制的位，速度快，效率高，而且节省存储空间，位运算做权限控制又相当地灵活。但是，位运算也有很大的局限，因为在32位计算机上，位移不能超过32次，这就要求权限数量不超过32种。</p>
<hr />延伸阅读：</p>
<ul>
<li>MySQL的<a href="http://dev.mysql.com/doc/refman/5.1/en/set.html" target="_blank">SET</a>类型，也是基于位运算的，恰当的运用，效果不错，可以参看<a href="http://dev.mysql.com/tech-resources/articles/mysql-set-datatype.html" target="_blank">教程</a></li>
</ul>
<hr />
<p><strong><a href="http://xiaobin.net/200906/bitwise-permission/">基于位运算的权限控制</a></strong> | 暂无评论，<a href="http://xiaobin.net/200906/bitwise-permission/#comments">添加评论</a>
<br>本文网址：<a href="http://xiaobin.net/200906/bitwise-permission/">http://xiaobin.net/200906/bitwise-permission/</a>
<br><a href="http://xiaobin.net">将之典藏</a> - 厚积而薄发，© 2005-2009. 如无特别声明，适用<a href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh" target="_blank">署名-非商业性使用-相同方式共享 3.0</a>授权，你可以署名使用全部或者部分内容用于非商业性目的。</p>]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
