素材牛VIP会员
在哪些问题上,你们会用移位运算<<,>>,这样和直接乘以数有啥显著的区别或者目的吗
 ba***ag  分类:Python  人气:1227  回帖:7  发布于6年前 收藏
    quota_mb = f.cleaned_data['quota']
    quota = quota_mb * (1 << 20)
    
    这里是MB转为B
 标签:python

讨论这个帖子(7)垃圾回帖将一律封号处理……

Lv4 码徒
铁***1 JS工程师 6年前#1

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

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

这样的。

Lv6 码匠
阿***斤 CEO 6年前#2

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

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

Lv3 码奴
起***劲 页面重构设计 6年前#3
  • 需要 2 的幂次时

  • 标志位存取

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

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

Lv5 码农
云***_ CEO 6年前#4

好问题。

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

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

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

Lv5 码农
龙***4 页面重构设计 6年前#5

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

Lv6 码匠
zh***ni 职业无 6年前#6

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

Lv5 码农
迷***文 JS工程师 6年前#7

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

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

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取