【问题标题】:Bit-wise operations on ByteStringByteString 上的按位操作
【发布时间】:2017-01-11 00:07:39
【问题描述】:

在 Haskell 中,按位操作似乎通常通过 Data.Bits module 和 Bits 类来处理。

我想对任意长度的 ByteStrings 执行位操作(例如,设置、清除、移位、掩码...),但我在任何地方都找不到 ByteStrings 的位实例。

我的问题:我应该自己实现实例吗(可能是一个很好的练习)?如果是这样,是否有任何建议可以获得一些“可接受的性能”?或者尝试直接在 ByteStrings 上进行位操作是一个坏主意,在这种情况下有什么更好的方法?

【问题讨论】:

  • 按位运算可以使用zipWith和字级运算。

标签: haskell bit-manipulation bytestring


【解决方案1】:

我看不出这是一个坏主意的任何理由。如果你想成为超级通用的,你可以实现

instance (Listlike l a, Bits a) => Bits (l a) where ...

这将为您提供任何 list-like 类型的 Bits 实现,这恰好发生在 include Bytestrings 上。

【讨论】:

  • “我看不出这是个坏主意的任何理由”,除非这是为了图书馆。不要将这样的孤儿实例放在库中。
  • 大概该实例看起来像instance (ListLike l a, Bits a) => Bits l where ...。但是你实际上是在重叠Bits 的所有其他实例。以 that 特定的方式执行此操作可能不是一个好主意。
  • 他们建议像newtype AggregateBits a = AggregateBits a 这样的东西,我建议在前提条件中使用FiniteBits 而不是Bits,另外,lListlike 的完整类型,而不是@987654331 @。总之,instance (Listlike l a, FiniteBits a) => Bits (AggregateBits l) where...
【解决方案2】:

我在 Hackage 上找到了 bits-bytestring 包,提供了您所要求的内容。

但我会小心一些操作,如果不是所有的字节串都具有相同的长度。具体而言,complement 设置了哪些位取决于字节串的长度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多