不少倍增的板子都須要算log,好比說LCA,RMQ,等等(其實我只知道這兩個倍增,唉太菜了)數組
而後計算log有一個math的頭文件,裏面的log函數就是求出log10(x),因而求log2(x)就至關於log(x)/log(2)函數
可是這樣算很容易出玄學bug,由於算出來多是取整×取整,而後就炸了spa
而後能夠本身手打一個log,代碼通常都是這樣的:code
int log(int x) { int cnt = -1; while(x) { x >>= 1; cnt++; } return cnt; } //-1表示錯誤(log0)
這個已經很快了,(吧),可是仍是有很大的常數。blog
通常來講能夠預處理出全部log,開一個數組,不停的×2×2而後所有預處理出來,之後用的時候查數組就能夠了。class
接下來重點來了!發放福利!bug
今天忽然想到了這個問題,而後喜大普奔地找到了個奇技淫巧的代碼:di
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; }