zoukankan      html  css  js  c++  java
  • 奇技淫巧:快速求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; 
    }
  • 相关阅读:
    行转列问题
    Session对象失效的客户端解决方法
    Spring之依赖注入
    Spring开发入门
    非关系型数据库redis
    Json(JavaScript Object Notation)
    Ajax
    JavaScript框架之JQuery
    Web核心之Filter过滤器
    Web核心练习之分页模块和条件模块(后台代码为主,jsp已经落伍)
  • 原文地址:https://www.cnblogs.com/euphoria-eden/p/7652705.html
Copyright © 2011-2022 走看看