这是my last question的后续措施。我设法实现了一个非常快速的“位队列生成器”
data BitQueueB = BQB !Word !Word
通过从左侧推入元素(从防护位开始),然后当我完成“构建”队列时,计算尾随零并将其移开,在左侧安装新的防护位。
但是,对于GHC countTrailingZeros引入时开始的。我也不禁想知道是否还有其他更神奇的方法可以完成这一转变,或者是向左移动。
重点
我有一个双字的两个字表示,保证至少设置了一位。我正在寻找最快的方式来将双字向左或向右移位,直到第一个置位被移位为止,而不使用
countLeadingZeros
或countTrailingZeros
。一个想法
我对这些问题的直觉表明,如果我转向左移,是否可以使用乘法的方法,但这也许只是一厢情愿。
最佳答案
左边比较烦人。尚未实际测试:
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
是一个相对公知的技巧,用于隔离最低设置位。