Haskell将Word8转换为Int到Bits

时间:2015-12-09 04:17:01

标签: haskell bits

我想将Word8转换为Int,所以我可以将它转换为Bits列表,无论如何将其转换为int或直接转换为位?

这是我目前的代码片段

intsToBits :: Int -> [Bit]
intsToBits x  =
  reverse (go x) where
  go 0 = [Zero]
  go n | n `mod` 2 == 1 = One : go (n `div` 2)
       | n `mod` 2 == 0 = Zero : go (n `div` 2)
  go _ = []

word8ToInt :: Word8 -> Int
word8ToInt = fromIntegral

decoder :: BS.ByteString -> IO [Bit]
decoder raw =
  do
     let raw' = BS.unpack raw
     let ls = go raw'
     return ls
       where
         go []     = []
         go [x]    = intsToBits $  x
         go (x:xs) = intsToBits (word8ToInt x) ++ go xs

2 个答案:

答案 0 :(得分:3)

Word8FiniteBits类的一个实例,因此您可以使用类似

的内容
toBitList x = map (testBit x) [0..(finiteBitSize x-1)]

或者,如果你想要反过来,[(finiteBitSize x-1), (finiteBitSize x-2)..0]

我从您的编辑中看到,您(显然)希望您的位从最重要到最不重要,并且您不需要任何前导零。有多种方法可以做到这一点,但最简单的方法是使用countLeadingZeros修改上述方法。

答案 1 :(得分:3)

询问问题:你真的应该举例说明你是如何解决这个问题的。腼腆,至少你想要的结果的一个例子,如“位”对你意味着什么。我倾向于将Word8值的集合视为位,因此需要执行操作。

尽管如此,我们可以提出并回答一系列相关问题。

Haskell中的位运算符是什么?

如果你想要位级操作,而不是像x || 2^i这样的算术技巧,你可以使用Bits类中的函数:

Prelude> import Data.Bits
Prelude Data.Bits> :i Bits
class Eq a => Bits a where
  (.&.) :: a -> a -> a
  (.|.) :: a -> a -> a
  xor :: a -> a -> a
  complement :: a -> a
  shift :: a -> Int -> a
  rotate :: a -> Int -> a
  zeroBits :: a
  bit :: Int -> a
  setBit :: a -> Int -> a
  clearBit :: a -> Int -> a
  complementBit :: a -> Int -> a
  testBit :: a -> Int -> Bool
  bitSizeMaybe :: a -> Maybe Int
  bitSize :: a -> Int
  isSigned :: a -> Bool
  shiftL :: a -> Int -> a
  unsafeShiftL :: a -> Int -> a
  shiftR :: a -> Int -> a
  unsafeShiftR :: a -> Int -> a
  rotateL :: a -> Int -> a
  rotateR :: a -> Int -> a
  popCount :: a -> Int

还有FiniteBits类:

class Bits b => FiniteBits b where
  finiteBitSize      :: b -> Int
  countLeadingZeros  :: b -> Int
  countTrailingZeros :: b -> Int

如何将Word8转换为[Bool]

这只是测试单词中的每个位,而b

toBits x = [testBit x i | i <- [0.. finiteBitSize x - 1]

如何将Word8转换为我不会向您显示的某个名为Bit的数据类型?

在您第一次编辑后,我现在认为您有data Bit = Zero | One,但我不清楚这是否正确。这似乎是家庭作业,这里给出的建议应该足以让其余的方式完成。