我可以在http://hackage.haskell.org/package/base-4.7.0.0/docs/Data-Bits.html#v:bit看到如何從一個Int轉換,N,到了第N位設置的位,使用第一位的指數
bit :: Int -> a
但是,我該怎麼辦的逆這個? (假設輸入位只有1位置位?)
我可以在http://hackage.haskell.org/package/base-4.7.0.0/docs/Data-Bits.html#v:bit看到如何從一個Int轉換,N,到了第N位設置的位,使用第一位的指數
bit :: Int -> a
但是,我該怎麼辦的逆這個? (假設輸入位只有1位置位?)
由於base-4.8.0.0有
countLeadingZeros :: FiniteBits b => b -> Int
countTrailingZeros :: FiniteBits b => b -> Int
這些指數的最顯著和至少-顯著組比特分別從最顯著和至少-顯著端部開始。從finiteBitSize :: FiniteBits b => b -> Int
減去從另一端算起。
popCount $ x-1
通過計算尾隨零的數量來實現這一點。減1將尾隨的零變成1,並重置應該在那裏的唯一一個。
這是很容易適應一個更一般的情況下沒有,只有一個輸入位被設置的假設:popCount $ complement x .&. (x-1)
主要的想法是一樣的,並與x
補的取與擺脫那些不是由減法創造的(這是唯一應該被計算的)。
這不返回最低設置位。像'0011001'將返回'1'。 '13'映射到'2'。 –
@WillemVanOnsem「(假設輸入位只有1位置位?)」 – leftaroundabout