将表示二进制数的字符串转换为基数10字符串haskell

时间:2011-05-07 14:07:40

标签: haskell

我有字符串“1001”,我想要字符串“9”。

数字库有(相当笨重)showIntAtBase,但我找不到相反的结果。

6 个答案:

答案 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

使用^reversezipWithlength等无需减慢速度。

此外,使用严格的折叠可以减少内存需求。

答案 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