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年后的自己)学习, 传承, 解决通用问题 的特性.