如何编写一个函数来返回对应十进制数的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)
答案 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)然后没有。