如何关闭所有零?

时间:2016-05-04 18:47:04

标签: haskell bit-manipulation ghc

这是my last question的后续行动。我设法实现了一个非常快的"位队列构建器"如

data BitQueueB = BQB !Word !Word

从左侧推入元素(从保护位开始),然后当我完成"构建"队列,计算尾随零并将它们移开,在左侧安装一个新的保护位。

然而,这个解决方案对于GHC<< 7.10,自countTrailingZeros被引入以来。我也无法想知道是否有更神奇的方法来实现这一转变,或者是左翼对手。

要点

我有一个双字的双字表示,保证至少有一个位设置。我正在寻找最快的方法将双字移到右边的,直到第一个设置位移开,而不使用countLeadingZeros或{{1 }}

一想法

我在这些问题上的不良直觉表明,如果我转向左移,可以某种方式使用乘法,但也许这只是一厢情愿的想法。

1 个答案:

答案 0 :(得分:2)

左边更烦人。实际上没有测试过:

m = x
m |= m >> 1
m |= m >> 2
m |= m >> 4
m |= m >> 8
m |= m >> 16
x = x * (0x80000000 / (m >> 1))

通过首先计算数字中存在的2的最高功率,然后乘以将其转换为2的最高可能功率所需的量,将最高设置位移到顶部。当顶部位已经设置(它将除以0)时它不喜欢它并且它需要知道的位数。所以最好只计算前导零而不是这个,或者可能有更好的东西,但我不知道。

右边的版本(完整性?)更好,只是

x / (x & -x)

其中x & -x是隔离最低设置位的一个相对众所周知的技巧。