quota_mb = f.cleaned_data['quota'] quota = quota_mb * (1 << 20) 这里是MB转为B
这段时间再看一本介绍canvas的书,里面有一段计算rgb颜色代码转换为16进制用到过位移,具体代码忘了书不在手边,等明天有空我找到更新下,只记得大概是像:
r >> 16 + g >> 8 + b >> 0
这样的。
C语言写位操作就算了,Python写位操作,如果不是实现某些特殊的操作的话,意义何在?本来用Python很多程度就是因为他的易用,这种反其道而行之的做法我不是很能理解。
而现代编译器(解释器)有自己的优化策略,有时候的自作聪明反而会弄巧成拙。所以就算是C语言,现在也提倡用“现代方法”写代码。当然,你的代码只是自己看,那是另外一回事。
需要 2 的幂次时
标志位存取
装 B:判断是否为奇数 if (number & 1)
if (number & 1)
位运算优点是十分快速,缺点是普通人看不懂。自行权衡
好问题。
事实上编译器在优化时就会把乘法转换为位运算,例如 10a => (2+8)a => 2a + 8a => a<<1 + a<<3。
那为什么要这么做呢,答案很简单啊,移位操作所需要的时间片是远小于乘法操作所需的时间片的。
然而在现实的场景中,编译器出于一些限制和未知情况的无法判断,并不敢如此大胆的去进行优化,所以我们会在不少“轮子项目”的源码中看到移位操作这样的写法,这是典型的牺牲可读性去赢取性能的一个取舍。
因为1M = 1024K= 1,218,448这个数我记不住呀,写1<<20比较简单。
首先,1<<20等价于2的20次幂,而1MB=2的10次幂KB,而1KB又等于2的10次幂的B,这样就实现了1MB到B的转换了。由于之前的quota_mb可能是浮点数,那么quota_mb * (1 << 20)的写法就可以确保结果是浮点数,因为位运算对整数进行操作,对于浮点数会出现无法运行的情况。
一般都是一些黑科技的优化方法会用到,平日里其实极少这么用
位运算的优势是速度快,劣势是可读性差(对于直接操作GPIO的嵌入式系统而言,可读性也不算差……)是否使用位运算,还是看需求喽