快速求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}\)甚至更快

posted @ 2021-03-15 17:14  ファイナル  阅读(387)  评论(0)    收藏  举报