2013-02-01 20 views
0

通過直線位操作正整數基地2(樓)這是我需要做的:找到最顯著位或登錄用C

int lg(int v) 
{ 
    int r = 0; 
    while (v >>= 1) // unroll for more speed... 
    { 
     r++; 
    } 
} 

我發現了上述解決方案在:http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog

這有效,但我需要做到沒有循環,控制結構或常量大於0xFF(255),這已被證明是非常困難的,我發現。我一直在試圖找出使用條件形式的東西

(x ? y : z) = (((~(!!x) + 1)) & y) | ((~(~(!!x) + 1)) & z) 

但我不能得到它的工作。謝謝你的時間。

+0

條件,我依稀回憶的方式找到最顯著位,但不是最顯著。但是如果你必須使用條件,你可能做得不對。 –

+0

[Compute fast log base 2 ceiling]可能的重複(http://stackoverflow.com/questions/3272424/compute-fast-log-base-2-ceiling) –

+2

是不是運算符'? :一個控制結構? –

回答

0

沒有任何控制結構,甚至沒有?:操作,你可以模擬你自己的算法中

int r = 0; 

x >>= 1; 
r += (x != 0); 
x >>= 1; 
r += (x != 0); 
... 

規定,在C,

  • X被認爲是積極的(否則有int x=-1;例如x >>= 1n次總是!= 0
  • 一個像x != 0返回0()或1(*真)
+0

!=不允許,但是我通過使用上面爲x寫的替換來解決它嗎? 1:0,所以我有r + =(((〜(!! x)+ 1))&1)| ((〜(〜(!! x)+ 1))&0)。你的答案有訣竅:-) –

0

這聽起來像一個家庭作業。那麼,如果你不能使用控制結構,一個好的選擇是預先計算你可以做的:分而治之。解決一個較小的部分(一個字節,一個半字節,你的選擇),並適用於你的整數部分。