编程小技巧

    返回首页    发表留言
本文作者:李德强
          技巧五:数字的状态开关
 
 

       今天跟大家分享的小技巧是跟“状态”有关的,我们在技巧四中已经讲述了利用数组转为其它形式的技巧。接下来我们来思考这样一个问题:想要为某一个文件设置一些权限,权限分为3种,分别是:可写“r”、可读“w”、可执行“x”。这3种权限可能同时存在,也可能同时不存在,也可能进行任意组合。我们先来说说一些不好的做法:可以将权限可能出现的所有情况做穷举,然后把所有的情况列出来分别用数字来表示。具体来说就是这样:

---		0
r--		1
rw-		2
rwx		3
-w-		4
-wx		5
--x		6
r-x		7

        也就是说从0~7这8个数是xwr三种权限的组合,如果我们读取到状态的值是5,于是就需要到上面这张表中去查找5对应的权限是"-wx"也就是“可执行”、“可写”、“不可读”。如果我们想给这个文件分配一个“r-x”这样的权限仍然需要到上面这张表中去查找“r-x”对应的状态值是7。这种做法的结果是对的,逻辑也是对的,但做起来似乎有点麻烦,就目前看来还太明显。我们为了说明问题把上面据说的权限扩展一下:如果这个文件有3种所属角色:“所属用户”、“所属用户组”、“其他用户”,每一种角色都需要为其分配这个文件的“r”、“w”、“x”那么对于这些权限的组合有多少种呢?是2的9次方=512种,那么如果按照上面的穷举法就是将这个组合全部列出来,并将其由0到511进行编号。这样做的结果就会导致程序判断起来非常复杂,逻辑也有些不清晰。

        那么好的做法是什么呢?我们来看一下这个权限问题的特点:每一个权限都是一个开关,我们如果用0表示关,用1表示开。于是无论哪一种权限,rwx的任何一个权限就可以用0和1来表示。我们知道冯诺依曼型计算机是二进制的,也就是说所有的数都是以二进行来存取,如果我们有一个数这个数在内存中是以bit位的形式来表示,也就是有若干个二进制位,每一个二进制位都可以是0或者1,也就是说这个数的每一个bit位都可以表示一个功能的开关。我们来看一下数字0和数字7

数字		二进制
0		000
1		001
2		010
3		011
4		100
5		101
6		110
7		111

        如果我们把一个数的3个bit位的值分别用于我们的权限表示,也就是说从右向左看:

第1位的0/1表示“-/x”也就是是否可执行的权限。

第2位的0/1表示“-/w”也就是是否可写的权限。

第3位的0/1表示“-/r”也就是是否可读的权限。

        于是,我们取得了一个权限的值,就可以采用位运算来对这些权限进行判断了:

if (chmod >> 0 & 1)
{
	//x
}
if (chmod >> 1 & 1)
{
	//w
}
if (chmod >> 2 & 1)
{
	//r
}

        我们再来看看高级权限部分,如果这个文件有3种所属角色:“所属用户”、“所属用户组”、“其他用户”,每一种角色都需要为其分配这个文件的“r”、“w”、“x”那么对于这些权限的处理办法就是使用3个八进制的数分别来表示“所属用户”、“所属用户组”、“其他用户”的权限:

rwx rwx r-x file1 chmod 755
rw- rw- r-- file2 chmod 664

        这也是Linux文件系统中的权限设计,非常的高明、非常巧妙,它的原理就是例用bit位的0/1来表示某个功能的开关。

 

        今天的小技巧你学会了吗?

 

 

    返回首页    返回顶部
  看不清?点击刷新

 

  Copyright © 2015-2023 问渠网 辽ICP备15013245号