快速求log2
快速求\(\log_2 x\)
1.cmath
log2?很慢
2.预处理
\(O(n+1)?\)很慢
3.枚举
\(while(i<n)i<<=1?O(log_2n)\)很慢
4.二分+<<
\(O(\log_2\log_2n)\)很慢
5.利用数据存储性质!!!
我们可以知道,\(double\)存储时有52位尾数部分,11位数部分,1位符号位
所以有了以下的优秀代码!!!
int Log2(double x){
if(x==1)return 0;
return ((*(unsigned ll*)&x>>52)&1023)+1;
}
经测试,常数为\(cmath\space \log 2\)的\(\frac{1}{20}\)甚至更快
因果乃旋转纺车,光彩之多面明镜
浮世苍茫,不过瞬逝幻梦
善恶爱诳,皆有定数
于命运之轮中
吞噬于黄泉之冥暗
呜呼,吾乃梦之戍人
幻恋之观者
唯于万华镜中,永世长存
浮世苍茫,不过瞬逝幻梦
善恶爱诳,皆有定数
于命运之轮中
吞噬于黄泉之冥暗
呜呼,吾乃梦之戍人
幻恋之观者
唯于万华镜中,永世长存

浙公网安备 33010602011771号