2

8 ビットのバイナリを指定して、その char 表現を取得したいと考えています。例えば:

[0,1,1,0,0,0,0,1] は、'a' のバイナリ表現だと思います。

前もって感謝します!

4

2 に答える 2

5
import Data.Char

ord2chr :: [Int] -> Char
ord2chr = chr . foldl (\a b -> 2*a + b) 0

今すぐ試すことができます

> ord2chr  [0,1,1,0,0,0,0,1]
'a'
于 2012-12-13T13:14:36.830 に答える
4

コメントで示唆したように、質問は 2 つに分けることができます。Haskellness のためにBit型を宣言した最初の部分の提案を次に示します。

data Bit = Zero | One

fromBits :: (Integral a) => [Bit] -> a
fromBits bits = foldl f 0 (zip [0..] (reverse bits))
    where
      f x (_, Zero) = x
      f x (n, One) = x + 2^n

それで、これは何をしますか?さて、あなたの質問は、ビットリストの最上位ビットが最初にあることを示唆しています。逆に処理するので、そうしますreverse bitsreverse bits次に、さまざまな要素が表す2 のべき乗を追跡する必要があります。これはziping with[0..]が行うことであり、[(0, 最下位ビット), (1, 2 番目の最下位ビット), .. .]. 最後に、ヘルパー関数が適切な 2 のべき乗をアキュムレータに追加foldlして、このペアのリストを消費します。f

型クラスを使用してIntegral、整数型を選択する必要がないようにしました。8 ビットの場合はInt、または さえも使用できます。Word8より長いビット リストの場合Integer、任意の精度を使用できます (以下の (*) も参照)。

2 番目の部分では、 をchrに変換するためにInt使用できCharます。ビット リストが大きすぎないことがわかっている場合 (*)、型を にfromIntegral変換できます。IntegralaInt

したがって、あなたが望むものは次のように書くことができます:

convert :: [Bit] -> Char
convert = chr . fromIntegral . fromBits

あなたの場合、convert [Zero, One, One, Zero, Zero, Zero, Zero, One]です'a'

(*) もちろん、そうであったとしても、変換は明らかに意味をなさないでしょう。しかし、ここで持ち帰りたいポイントがあります。問題を 2 つの部分に分割しました。最初の部分 (ビット リストの処理) は、より一般的な方法で解決できることがわかりました。設定。たとえば、fromBits (One:(replicate 100 Zero))2^100 です。

于 2012-12-13T12:29:09.250 に答える