• 目录:

    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 语句.

    反思

    我的 -4 -2 -1 的解决方案, 在二进制的角度上看, 也是在依次检查最高位、次高位、最低位. 只是我一直在十进制的角度思考问题. 就像是只能接受时域波形, 不会在频域上思考问题一样!!!

    追评

    2021年, 现在看来, 二进制的方式已经成为了理所当然的存在…但这是知识与经验的作用, 并不是思考的结果…

    想起小学一二年级的时候, 用四则运算算出了鸡兔同笼的问题, 对自己的思路非常有成就感, 现在回头看呢? 已经完全无法复现当时的思路了, 取而代之的是里所应当的代数运算…

    知识与经验, 应该具备容易被他人(或是n年后的自己)学习, 传承, 解决通用问题 的特性.