我想清除任意Bits类型的最低有效位。问题是,我不一定拥有Num
实例,因此x.&.(x-1)
不是一个选项。我能想到的唯一功能是:
clearLsb x = x `clearBit` countTrailingZeros x
我根据x&(x-1)
版本对其进行了基准测试,无论优化级别如何,Word32
和Word64
的速度都会慢1.5。如果有人知道一些聪明的黑客,我将不胜感激。
答案 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}的实例}}。
虽然编写显式实例比使用这些语言扩展更好
子>