这是my last question的后续行动。我设法实现了一个非常快的"位队列构建器"如
data BitQueueB = BQB !Word !Word
从左侧推入元素(从保护位开始),然后当我完成"构建"队列,计算尾随零并将它们移开,在左侧安装一个新的保护位。
然而,这个解决方案对于GHC<< 7.10,自countTrailingZeros
被引入以来。我也无法想知道是否有更神奇的方法来实现这一转变,或者是左翼对手。
我有一个双字的双字表示,保证至少有一个位设置。我正在寻找最快的方法将双字移到右边的或,直到第一个设置位移开,而不使用countLeadingZeros
或{{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
是隔离最低设置位的一个相对众所周知的技巧。