奇技淫巧:快速求log2(x)

很多倍增的板子都需要算log,比如说LCA,RMQ,等等(其实我只知道这两个倍增,唉太菜了)

然后计算log有一个math的头文件,里面的log函数就是求出log10(x),于是求log2(x)就相当于log(x)/log(2)

但是这样算很容易出玄学bug,因为算出来可能是取整×取整,然后就炸了

然后可以自己手打一个log,代码一般都是这样的:

int log(int x) {
  int cnt = -1; 
  while(x) {
    x >>= 1; 
    cnt++; 
  }
  return cnt; 
}
//-1表示错误(log0)

这个已经很快了,(吧),但是还是有很大的常数。

一般来说可以预处理出所有log,开一个数组,不停的×2×2然后全部预处理出来,以后用的时候查数组就可以了。

接下来重点来了!发放福利!

今天突然想到了这个问题,然后喜大普奔地找到了个奇技淫巧的代码:

 

int log(int n) {  
  int result = 0;  
  if(n&0xffff0000) {result += 16; n >>= 16; }  
  if(n&0x0000ff00) {result += 8; n >>= 8; }  
  if(n&0x000000f0) {result += 4; n >>= 4; }  
  if(n&0x0000000c) {result += 2; n >>= 2; }  
  if(n&0x00000002) {result += 1; n >>= 1; }  
  return result; 
}

 

posted @ 2017-10-11 20:34  全宇宙最最最菜的菜鸡  阅读(4922)  评论(1编辑  收藏  举报