Data.Bits对二进制表示的操作

时间:2018-01-02 17:04:35

标签: haskell bitwise-operators

我想在二进制数据上使用Data.Bits按位运算符。 我需要使用哪种数据类型? 我写了这个函数,例如:

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

我想获取输入二进制类型或至少String(不是Int),但仍然使用Data.Bits

那么我需要改变才能像这样使用它? : ch 11111111 101110011 10110101

2 个答案:

答案 0 :(得分:4)

如上所述,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

在代码文件中,您可以使用语言编译指示启用它:

{-# LANGUAGE BinaryLiterals #-}

如果你有二进制数的字符串表示,你首先需要解析它们。参见例如Convert a string representing a binary number to a base 10 string haskell

答案 1 :(得分:0)

二进制数据I / O的一个很好的选择是Data.ByteString.Lazy,这是一个高度优化的库,用于读取Date值。它包括let decoder = JSONDecoder() let formatter = DateFormatter() formatter.locale = Locale(identifier: "en_US_POSIX") formatter.dateFormat = "MM-dd-yyyy" decoder.dateDecodingStrategy = .formatted(formatter) let result = try decoder.decode(Person.self, from: data) Word8中大多数列表和I / O函数的模拟,非常适合高效的交互式I / O,因为它读取字节并可以将其写为懒惰评估的严格数组列表。它还具有有效的功能,可以转换为各种编码。另请参阅this tutorial