十进制数中的1位数

时间:2015-08-10 14:47:39

标签: haskell

如何编写一个函数来返回对应十进制数的1位数?也许是平方根函数?类型应为:

bits :: Int -> Int

编辑:厌恶

uns :: Int -> Int
uns  0 = 0
uns 1 = 1
uns x | mod x 2 == 1 = 1 + uns (div x 2)
      | otherwise = uns (div x 2)

4 个答案:

答案 0 :(得分:6)

这个老把戏怎么样?

import Data.Bits

countOnes 0 = 0
countOnes x = 1 + countOnes (x .&. (x-1))

它只会递归 n n x 中的一位数。

当然,如果您要导入Data.Bits,那么您也可以使用popCount作为@Cirdec建议。

答案 1 :(得分:4)

使用popCount中的Data.Bits,也称为数字的汉明重量。优点是某些CPU具有专门用于计算此指令的指令,从而实现高性能。

λ> import Data.Bits
λ> :t popCount
popCount :: Bits a => a -> Int
λ> popCount 255
8
λ> popCount 0xa5
4

答案 2 :(得分:3)

sum . map (`mod` 2) . takeWhile ( /= 0) . iterate (`quot` 2)

答案 3 :(得分:3)

我觉得Luka有更好的版本,但也许你有点理解它,所以这是我暗示的(这是Luka只做了天真的递归):

bits :: Int -> Int
bits 0 = 0
bits n = let (d,r) = n `divMod` 2
         in r + bits d

这个想法是连续除以2并查看余数 - 如果它是1那么你找到一个设定位,如果不是(那么它必须是0)然后没有。