清除最不重要的设置位

时间:2016-07-03 18:44:52

标签: haskell bit-manipulation

我想清除任意Bits类型的最低有效位。问题是,我不一定拥有Num实例,因此x.&.(x-1)不是一个选项。我能想到的唯一功能是:

clearLsb x = x `clearBit` countTrailingZeros x

我根据x&(x-1)版本对其进行了基准测试,无论优化级别如何,Word32Word64的速度都会慢1.5。如果有人知道一些聪明的黑客,我将不胜感激。

1 个答案:

答案 0 :(得分:3)

如果可用,您可以将函数重载为选择类型级的更高效实现。这需要添加一个类型类,但即使使用countTrailingZeros实现,您也必须将某些类型类约束强加给您的函数(即FiniteBits(1)

特别是,对于某些语言扩展,所有std::move类型都可以设置为使用Num等式(2)

a .&. (a - 1)

<子> 1。另请注意,对于{-# LANGUAGE FlexibleInstances, UndecidableInstances #-} import Data.Bits (Bits, (.&.)) class LSB a where clear :: a -> a instance (Bits a, Num a) => LSB a where clear a = a .&. (a - 1) -- more efficient implementation newtype Foo = ... -- some type not instance of Num instance LSB Foo where clear a = ... -- some other approach ,您排除了countTrailingZeros类型,Integer类型检查,因为它不是{{1}的实例}}。
虽然编写显式实例比使用这些语言扩展更好