【问题标题】:Data.Bits operation on binary represention二进制表示上的 Data.Bits 操作
【发布时间】:2018-01-03 08:20:44
【问题描述】:

我想对二进制数据使用 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

【问题讨论】:

  • 二进制数据?像Word8 的流? ByteString?
  • 嗯,我不确定。我试图实现“sha256”功能,因此我将文本的String 作为输入并立即将其转换为表示的二进制文本。所以现在是String

标签: haskell bitwise-operators


【解决方案1】:

正如所写,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

【讨论】:

  • 谢谢。一件小事,给字符串"11111111"表示你如何转换成0b11111111BinaryLiterals类型?
  • 但他正在转换为代表整数。我想我错过了如何将其更改为转换为我们谈到的0bXXX 类型。
  • @limitless 像0b101010 这样的表达式不是数据类型;这是一个代表。这只是写数字42的一种方式。如果你去0b101010 :: Int8 它是42 作为Int8。如果你去0b101010 :: Word64,它是42Word64。您还可以将42 表示为十六进制数字,如下所示:0x2a :: Word64。仍然是42 作为Word64;这只是两种不同的写法。
【解决方案2】:

对于二进制数据的 I/O,一个不错的选择是 Data.ByteString.Lazy,这是一个高度优化的库,用于读取 Word8 值。它包括PreludeData.List 中大多数列表和I/O 函数的类似物,并且非常适合高效的交互式I/O,因为它可以读取字节并可以将它们作为惰性求值写出严格数组列表。它还具有转换各种编码和从各种编码转换的有效功能。另见this tutorial

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 2021-07-25
    • 1970-01-01
    相关资源
    最近更新 更多