代码之家  ›  专栏  ›  技术社区  ›  limitless

数据二进制表示的位运算

  •  2
  • limitless  · 技术社区  · 7 年前

    我想使用数据。二进制数据上的位运算符。 我需要使用什么数据类型? 我编写了这个函数,例如:

    ch :: Int8 -> Int8 -> Int8 -> Int8
    ch x y z = (x .&. y) `xor` ((complement x) .|. z)
    

    我想获取作为输入的二进制类型或至少 String (不是 Int )但仍然使用数据。位

    那么我需要做什么改变才能像这样使用它呢 ch 11111111 101110011 10110101

    2 回复  |  直到 7 年前
        1
  •  4
  •   Mark Seemann    7 年前

    如前所述, ch 只需要 Int8 值,但您可以在不更改其实现的情况下放宽函数的类型:

    import Data.Bits
    
    ch :: Bits a => a -> a -> a -> a
    ch x y z = (x .&. y) `xor` (complement x .|. z)
    

    二进制值只是整数的特定表示形式,但为了使内容更具可读性,可以启用 BinaryLiterals ,例如,在GHCi中:

    *Q48065001> :set -XBinaryLiterals
    *Q48065001> ch 0b11111111 0b101110011 0b10110101
    -58
    

    在代码文件中,可以使用语言pragma启用该功能:

    {-# LANGUAGE BinaryLiterals #-}
    

    如果您有二进制数的字符串表示,那么首先需要对其进行解析。参见示例。 Convert a string representing a binary number to a base 10 string haskell

        2
  •  0
  •   Davislor    7 年前

    二进制数据I/O的一个好选择是 Data.ByteString.Lazy ,一个高度优化的阅读库 Word8 价值观它包括 Prelude 并且在 Data.List ,非常适合高效的交互式I/O,因为它可以读取字节并将其作为严格数组的延迟计算列表进行输出。它还具有与各种编码进行转换的有效功能。另请参见 this tutorial .