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