位运算 & (与)实际应用
疑问?
在linux
系统中,我们经常使用chmod
进行文件权限修改(读,写,执行)
比如我要对some.sh
赋予权限: chmod u=rwx,g=rx,o=x some.sh
u=rwx
:u
表示文件所有者(user)。rwx
表示读(r)、写(w)和执行(x)权限。- 这意味着文件所有者将拥有读、写和执行权限。
g=rx
:g
表示文件所属组(group)。rx
表示读(r)和执行(x)权限。- 这意味着文件所属组将拥有读和执行权限,但没有写权限。
o=x
:o
表示其他用户(others)。x
表示执行权限。- 这意味着其他用户将只有执行权限,没有读和写权限。
可以看到我们分别对文件所属人,文件所属组,其他用户赋予了读,写,执行的权限,那这些信息实际存储是什么样子的呢?难道是一个数组?
u: [r, w, x], g: [r, x], o: [x]
这种看起来最直观,但有没有更优雅的方式,比如用一个数字就能表示所有的权限信息,u: 7, g: 5, o: 1
,经常用这个命令的人知道,上述的写法可以使用chmod 751 some.sh
直接表示
那为什么我通过数字7
就能知道是对应的rwx
呢?其实从二进制层面来看,就直观许多
- execution: 执行,通过
1
表示,二进制表示:001
- write: 编写,通过
2
表示,二进制表示:010
- read: 读取,通过
4
表示,二进制表示:100
那 7
实际上是 通过 1 + 2 + 4
得来的,而7的二进制:111
从这里就能看出,当相应的权限拥有时,对应的数字进行相加,从二进制的层面来看,每个权限只会赋值一次,所以进行相加时,二进制中的每一位信息都能进行保留。然后我们再通过查看权限对应位是否为1,就能知道是否有该权限
但二进制是让机器看的,我们怎么知道是不是有值,那这里通过&
运算就能快速知道结果了
位运算 & (与)
规则:二进制对应位两两进行逻辑AND运算(只有对应位的值都是 1 时结果才为 1, 否则即为 0)即 0&0=0
,0&1=0
,1&1=1
比如 111(7) & 010(2)= 010(2)
就能确认出是拥有权限的
如果我们只赋予了写,执行权限,我们想看有没有读权限。011(3)& 100(4) = 000
计算结果就是没有权限。
可以看到通过位运算,就能优雅的实现权限设置和读取。当然这里每个权限的取值也是有规则的,必须是2的进制位。
比如:1(0001), 2(0010), 4(0100), 8(1000)
以此类推。
总结:
当我们自己在开发中遇到类似的需求,比如:权限设置之类的,有多种情况,并且每种情况只设置一次。那就能使用该技巧,来进行优化。