在 haskell 中,如何从十进制数中生成二进制数字?

Posted

技术标签:

【中文标题】在 haskell 中,如何从十进制数中生成二进制数字?【英文标题】:In haskell how can I make binary digits from a decimal number? 【发布时间】:2021-12-09 23:32:26 【问题描述】:

实现Bin函数,倒序返回一个非负整数的二进制数!

例子:

Bin 0 == [] Bin 1 == [1] Bin 2 == [0,1] Bin 10 == [0, 1, 0, 1]
Bin :: Integer -> [Int]
Bin 0 = []
Bin a `div` 2 = b
Bin a `mod` 2 = c

我想将我的除法结果返回给 Bin 函数并再次对其进行修改等等。 我该如何解决这个问题?我能得到一些帮助吗?

【问题讨论】:

函数都是小写的,所以bin而不是Bin 你希望Bin a `div` 2 = b 做什么? 【参考方案1】:

只有一个参数,所以bin的实现如下:

bin :: Integer -> [Int]
bin 0 = []
bin n = …

我们可以用divMod :: Integral a => a -> a -> (a, a)确定模数并将数字除以2,我们可以使用where子句设置变量dm

bin :: Integer -> [Int]
bin 0 = []
bin n = …
    where (d, m) = divMod n 2

我们不能直接使用m,因为这是Integer,而不是Int,我们可以使用fromIntegral :: (Integral a, Num b) => a -> bInteger转换为Int

因此,我们需要构造一个以m 作为该列表元素的列表,并使用递归来确定列表中的其他项目。因此, 部分应该构造这样的列表。我把它留作练习。提示:您可以使用x 作为第一项,将xs 作为剩余项目的列表,使用(x:xs)

【讨论】:

像这样: Bin n = (x:m:xs) = x : Bin m xs ?我将 m 添加到列表中,我想归还 m 和剩余的列表。这是正确的还是我必须做点什么? @hello16:(x:m:xs) 在这里做什么? 它们只是列表中的项目。 @hello16: 那么(x : bin m xs)是什么?定义每个子句只能包含 一个 = 哦,所以我只能用一个=。比 bin n = bin m xs 。我想用这个来回馈 m 和列表的其余部分。我需要归还 m 还是只需要归还 xs?

以上是关于在 haskell 中,如何从十进制数中生成二进制数字?的主要内容,如果未能解决你的问题,请参考以下文章

如何在R中生成随机的64位十六进制数?

在 Haskell 中生成 .wav 声音数据

在 Haskell 中添加存储为 0 和 1 列表的两个二进制数,而不使用反向

在Haskell中把二进制转换成十进制

在Haskell中把十进制转换成二进制

如何在 Openssl 中生成十六进制输出?