Haskell将字8转换为Int,再转换为位

Haskell将字8转换为Int,再转换为位,haskell,bits,Haskell,Bits,我想把一个单词8转换成一个整数,这样我就可以把它转换成一个比特列表。有没有办法把它转换成整数或者直接转换成比特呢 这是我当前的一段代码 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)

我想把一个单词8转换成一个整数,这样我就可以把它转换成一个比特列表。有没有办法把它转换成整数或者直接转换成比特呢

这是我当前的一段代码

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

Word8
FiniteBits
类的一个实例,因此您可以使用

toBitList x = map (testBit x) [0..(finiteBitSize x-1)]
或者,如果您希望使用另一种方式,
[(finiteBitSize x-1),(finiteBitSize x-2)…0]



我从您的编辑中看到,您(显然)希望您的位按从最高有效到最低有效的顺序排列,并且您不希望有任何前导零。有多种方法可以做到这一点,但最简单的方法可能是在提问时使用
countleadingzero
Meta修改上述方法:您确实应该给出一些示例,说明您是如何尝试解决问题的。在此之前,至少举一个你想要的结果的例子,比如“比特”对你意味着什么。我倾向于将
Word8
值的集合视为位,因此需要执行操作

也就是说,让我们提出并回答一系列相关问题

Haskell中的位运算符是什么?

如果需要位级运算,可以使用Bits类中的函数,而不是执行诸如
x | | 2^i
之类的算术运算:

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]

toBits x=[testBit x i |我需要将此应用于我自己的名为
Bit
的数据类型,其中每个数据类型都由
One
Zero
表示,那么我在这里如何做到这一点呢?@asyiefel,在我可以继续之前,你必须展示你的努力。我已经用一段代码更新了上面的内容。如果需要,我可以提供所有内容e> 数据位=0 | 1
。这不是硬件,这是一个项目。你为什么在解码函数的IO单子中?你甚至没有使用它。你可以只写
decoder=go.BS.unpack where go=[…]
你已经给了
intsToBits
函数类型
Int->[Bit]
。但这不是此函数最通用的类型!最通用的类型是
积分a=>a->[Bit]
。换句话说,您已经获得了所需的功能,只需更改类型即可。使用此类型,
intsToBits
将愉快地接受
Word8
。然后您只需使用
decoder=concatMap intsToBits.unpack