如何编写一个函数来返回对应十进制数的1位数?也许是平方根函数?类型应该是这样的:
bits :: Int -> Int
Run Code Online (Sandbox Code Playgroud)
编辑:厌倦了
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)
Run Code Online (Sandbox Code Playgroud)
这个老把戏怎么样?
import Data.Bits
countOnes 0 = 0
countOnes x = 1 + countOnes (x .&. (x-1))
Run Code Online (Sandbox Code Playgroud)
它只递归n次,其中n是x中一位的数量.
当然,如果您要导入Data.Bits,那么您可以使用popCount@Cirdec建议.
使用popCountfrom Data.Bits,也称为数字的汉明权重。优点是某些 CPU 有专门用于计算的指令,从而实现高性能。
\xce\xbb> import Data.Bits\n\xce\xbb> :t popCount\npopCount :: Bits a => a -> Int\n\xce\xbb> popCount 255\n8\n\xce\xbb> popCount 0xa5\n4\nRun Code Online (Sandbox Code Playgroud)\n