我有字符串“1001”,我想要字符串“9”。
数字库有(相当笨重)showIntAtBase,但我找不到相反的结果。
答案 0 :(得分:13)
这或多或少是您从Prelude中寻找的内容。 来自Numeric:
(注意:readInt是showIntAtBase的“双重”,readDec是showInt的“双重”。不一致的命名是一个历史事故。)
import Data.Char (digitToInt)
import Data.Maybe (listToMaybe)
import Numeric (readInt)
readBin :: Integral a => String -> Maybe a
readBin = fmap fst . listToMaybe . readInt 2 (`elem` "01") digitToInt
-- readBin "1001" == Just 9
答案 1 :(得分:10)
自原始帖子以来已经有一段时间了,但为了将来读者的利益,我会使用以下内容:
import Data.Char (digitToInt)
import Data.List (foldl')
toDec :: String -> Int
toDec = foldl' (\acc x -> acc * 2 + digitToInt x) 0
使用^
,reverse
,zipWith
,length
等无需减慢速度。
此外,使用严格的折叠可以减少内存需求。
答案 2 :(得分:3)
来自PLEAC:
bin2dec :: String -> Integer
bin2dec = foldr (\c s -> s * 2 + c) 0 . reverse . map c2i
where c2i c = if c == '0' then 0 else 1
答案 3 :(得分:2)
这有帮助吗? http://pleac.sourceforge.net/pleac_haskell/numbers.html
来自页面:
bin2dec :: String -> Integer
bin2dec = foldr (\c s -> s * 2 + c) 0 . reverse . map c2i
where c2i c = if c == '0' then 0 else 1
-- bin2dec "0110110" == 54
答案 4 :(得分:1)
由于
1001 = 1 * 2^0 + 0 * 2^1 + 0 * 2^2 + 1 * 2^3 = 1 + 0 + 0 + 8 = 9
┌───┬───┬───┬───┐
│1 │0 │0 │1 │
├───┼───┼───┼───┤
│2^3│2^2│2^1│2^0│
└───┴───┴───┴───┘
很明显:
fromBinary :: String -> Int
fromBinary str = sum $ zipWith toDec (reverse str) [0 .. length str]
where toDec a b = digitToInt a * (2 ^ b)
答案 5 :(得分:0)
binario :: Int -> [Int]
binario 1 = [1]
binario n = binario(div x 2)++(mod n 2:[])
致@laionzera