2017-08-08 38 views

回答

7

由於base-4.8.0.0

countLeadingZeros :: FiniteBits b => b -> Int 
countTrailingZeros :: FiniteBits b => b -> Int 

這些指數的最顯著和至少-顯著組比特分別從最顯著和至少-顯著端部開始。從finiteBitSize :: FiniteBits b => b -> Int減去從另一端算起。

3

popCount $ x-1通過計算尾隨零的數量來實現這一點。減1將尾隨的零變成1,並重置應該在那裏的唯一一個。


這是很容易適應一個更一般的情況下沒有,只有一個輸入位被設置的假設:popCount $ complement x .&. (x-1)

主要的想法是一樣的,並與x補的取與擺脫那些不是由減法創造的(這是唯一應該被計算的)。

+0

這不返回最低設置位。像'0011001'將返回'1'。 '13'映射到'2'。 –

+1

@WillemVanOnsem「(假設輸入位只有1位置位?)」 – leftaroundabout