在哪些问题上,你们会用移位运算<<,>>,这样和直接乘以数有啥显著的区别或者目的吗

梅梅
  • 763
    quota_mb = f.cleaned_data['quota']
    quota = quota_mb * (1 << 20)
    
    这里是MB转为B
回复
阅读 4.8k
7 个回答

这段时间再看一本介绍canvas的书,里面有一段计算rgb颜色代码转换为16进制用到过位移,具体代码忘了书不在手边,等明天有空我找到更新下,只记得大概是像:

r >> 16 + g >> 8 + b >> 0

这样的。

因为1M = 1024K= 1,218,448
这个数我记不住呀,写1<<20比较简单。

0xlhh
  • 4
新手上路,请多包涵

好问题。

事实上编译器在优化时就会把乘法转换为位运算,例如 10a => (2+8)a => 2a + 8a => a<<1 + a<<3。

那为什么要这么做呢,答案很简单啊,移位操作所需要的时间片是远小于乘法操作所需的时间片的。

然而在现实的场景中,编译器出于一些限制和未知情况的无法判断,并不敢如此大胆的去进行优化,所以我们会在不少“轮子项目”的源码中看到移位操作这样的写法,这是典型的牺牲可读性去赢取性能的一个取舍。

首先,1<<20等价于2的20次幂,而1MB=2的10次幂KB,而1KB又等于2的10次幂的B,这样就实现了1MB到B的转换了。由于之前的quota_mb可能是浮点数,那么quota_mb * (1 << 20)的写法就可以确保结果是浮点数,因为位运算对整数进行操作,对于浮点数会出现无法运行的情况。

C语言写位操作就算了,Python写位操作,如果不是实现某些特殊的操作的话,意义何在?
本来用Python很多程度就是因为他的易用,这种反其道而行之的做法我不是很能理解。

而现代编译器(解释器)有自己的优化策略,有时候的自作聪明反而会弄巧成拙。
所以就算是C语言,现在也提倡用“现代方法”写代码。
当然,你的代码只是自己看,那是另外一回事。

  • 需要 2 的幂次时

  • 标志位存取

  • 装 B:判断是否为奇数 if (number & 1)

位运算优点是十分快速,缺点是普通人看不懂。自行权衡

一般都是一些黑科技的优化方法会用到,平日里其实极少这么用

位运算的优势是速度快,劣势是可读性差(对于直接操作GPIO的嵌入式系统而言,可读性也不算差……)
是否使用位运算,还是看需求喽

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏