第一位的指数

问题描述:

我可以在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补的取与摆脱那些不是由减法创造的(这是唯一应该被计算的)。

+0

这不返回最低设置位。像'0011001'将返回'1'。 '13'映射到'2'。 –

+1

@WillemVanOnsem“(假设输入位只有1位置位?)” – leftaroundabout