ByteString上的按位操作

ByteString上的按位操作

问题描述:

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

我想对任何长度的ByteStrings(例如set,clear,shift,masks ...)执行位操作,但是我无法在任何地方找到ByteStrings的位实例。

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

+1

对于按位运算,可以使用'zipWith'和字级操作。 – Alec

我看不出任何理由为什么这是一个坏主意。如果你想成为超级一般来说,你可以实现

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

这会给你任何list-like类型,这恰好include Bytestrings一个位实现。

+3

“我不明白为什么这是一个坏主意”,除非这是一个图书馆。不要在库中放置像这样的孤立实例。 – Cubic

+1

假设实例看起来像'instance(ListLike l a,Bits a)=> Bits l where ...'。但是,你实际上重叠了每一个Bits的实例。 *可能不是一个好主意,用*那种特殊的方式来做到这一点。 –

+0

他们建议像'newtype AggregateBits a = AggregateBits a'这样的东西,我建议在前提条件下使用'FiniteBits'而不是'Bits'。另外,'l'是'Listlike'的完整类型,而不是'l a'。总而言之,'instance(Listlike l a,FiniteBits a)=> Bits(AggregateBits l)where ...' – NovaDenizen

我在Hackage上发现了bits-bytestring软件包,提供您所要求的。

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