1、2、4 怎么玩


背景

实际业务场景不便透露, 涉及到公司. 举个 linux 上的例子:
设置文件权限时, 可以用7代表可读可写可执行, 6代表可读可写…

这是怎么算出来的?
你可以直接 看这里 得到更准确合理的解释. 或者按照文章的顺序往下看:
假设1代表可执行, 2代表可写, 4代表可读. 那么7=4+2+1, 6=4+2…

问题

程序是如何把7解析成4+2+1的呢? 传个5给它, 它是怎么解析出要加可读和可执行的权限呢?

我的答案

1、2、4、+ 的组合总共就只有1~7 7种, 穷举, 写7个 if 或者7个 case 肯定是能实现功能的. 但程序肯定是不能这么写的.

思考了几分钟, 得到了下面这个答案:


while mod > 0:
    if mod > 4:
        #TODO 添加读权限
        mod = mod - 4
    if mod > 2:
        #TODO 添加写权限
        mod = mod - 2
    if mod > 1:
        #TODO 添加执行权限
        mod = mod - 1

固定的三个 if .

同事的答案

二进制, 三位二进制

二进制的 111 表示十进制的7. 最高位表示读权限, 中间位表示写权限, 最低位表示执行权限.

程序通过判断每个位上的数(& 1 « n), 决定是否增加特定的权限. 可能也是需要固定的三个 if 语句.

反思

听到”二进制”三个字, 瞬间让我想起了高中、初中、小学的数学(ps: 因为大学都没好好学数学). 我的数学水平一直很 low, 一点都不聪明. 思路没有根, T.T 运气好能想到解决方案.

思考的过程在我的世界里, 不是一条线, 顺着拉. 而是一块拼图, 哪块像试哪块.

天啦…我的这种思维方式真的适合编程吗!!!

其实我是忘记了权限是二进制表示的这个说法, 不管这种说法是不是最初的作者的本意, 网上是确实一直流传着的. 而我的-4 -2 -1 的解决方案, 在二进制的角度上看, 也是就在检查最高位、次高位、最低位. 只是我一直在十进制的角度思考问题. 就像是只能接受时域波形, 根本不能在频域上思考问题一样!!! 我只理解多个不同频率的时域波形在一个坐标系里, 从切面看到频域波形的那个动画!!! 就是个学渣!!!!