使用库函数获取给定数字所需总位数的Haskell程序
Haskell拥有内置函数,例如finiteBitSize、ceiling、logBase、length和showIntAtBase,可用于获取给定数字所需的总位数。在第一个示例中,我们将使用(bits = finiteBitSize (fromIntegral x :: Int))函数;在第二个示例中,我们将使用(bitsRequired n = ceiling (logBase 2 (fromIntegral (abs n) + 1)))函数;在第三个示例中,我们将使用(bitsRequired n = length $ showIntAtBase 2 intToDigit (abs n) "")函数。
算法
步骤1 − 导入内部库
步骤2 − 使用ceiling和logBase函数定义bitsRequired函数
步骤3 − 程序执行将从main函数开始。main()函数控制整个程序。它被编写为main = do。
步骤4 − 定义名为“x”的变量,用于保存需要计算总位数的数字。
步骤5 − 调用bitsRequired函数并将数字作为参数传递给它。
步骤6 − 调用函数后,将所需的结果总位数打印到控制台。
示例1
在这个示例中,使用finiteBitSize函数计算给定数字所需的总位数。
import Data.Bits (FiniteBits, finiteBitSize) main :: IO () main = do let x = 42 :: Int bits = finiteBitSize (fromIntegral x :: Int) putStrLn $ "The number " ++ show x ++ " requires " ++ show bits ++ " bits to represent."
输出
[1 of 1] Compiling Main ( main.hs, main.o ) Linking main ... The number 42 requires 64 bits to represent.
示例2
在这个示例中,使用ceiling和logBase函数计算给定数字所需的总位数。
import Numeric.Natural bitsRequired :: Integer -> Int bitsRequired n = ceiling (logBase 2 (fromIntegral (abs n) + 1)) main :: IO () main = do let x = 42 bits = bitsRequired x putStrLn $ "The number " ++ show x ++ " requires " ++ show bits ++ " bits to represent."
输出
[1 of 1] Compiling Main ( main.hs, main.o ) Linking main ... The number 42 requires 6 bits to represent.
示例3
在这个示例中,使用length和showIntAtBase函数计算给定数字所需的总位数。
import Numeric (showIntAtBase) import Data.Char (intToDigit) bitsRequired :: Integer -> Int bitsRequired n = length $ showIntAtBase 2 intToDigit (abs n) "" main :: IO () main = do let x = 42 bits = bitsRequired x putStrLn $ "The number " ++ show x ++ " requires " ++ show bits ++ " bits to represent."
输出
[1 of 1] Compiling Main ( main.hs, main.o ) Linking main ... The number 42 requires 6 bits to represent.
结论
数字所需的总位数取决于数字本身以及用于表示它的位数。例如,如果我们使用32位整数,则可以表示的最大值为2^31 - 1 = 2147483647,表示它需要31位。如果我们使用64位整数,则可以表示的最大值为2^63 - 1 = 9223372036854775807,表示它需要63位。我们可以使用某些函数在Haskell中计算相同的结果。