簡體   English   中英

Haskell 將 Word8 轉換為 Int 到 Bits

[英]Haskell convert Word8 to Int to 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

Word8FiniteBits類的一個實例,因此您可以使用類似

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

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


我從您的編輯中看到您(顯然)希望您的位按從最重要到最不重要的順序排列,並且您不想要任何前導零。 有多種方法可以做到這一點,但最簡單的方法可能是使用countLeadingZeros修改上述方法。

關於提問的元:你真的應該舉一些例子來說明你是如何嘗試解決問題的。 害羞的是,至少有一個你想要的結果的例子,比如“位”對你意味着什么。 我傾向於將Word8值的集合視為位,因此需要執行操作。

也就是說,讓我們提出並回答一系列相關問題。

Haskell 中的位運算符是什么?

如果你想要位級操作,而不是像x || 2^i這樣的算術技巧 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 data Bit = Zero | One但不清楚這是否正確。 似乎家庭作業和這里給出的建議應該足以完成剩下的工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM