2016-10-02 75 views
0

查看寄存器内容并计数设置为0的位数然后将该计数保存在不同寄存器中的最有效方法是什么?将寄存器中的位数设置为0的计数

显然一个循环与LSR一起是必需的,但我不知道如何与AND指令以及EOR一起实现。

+2

可能的重复[在寄存器,ARM程序中计数为1的最快方法](http://stackoverflow.com/questions/15736602/fastest-way-to-count-number-of-1s-in-一个寄存器-臂组件) – Notlikethat

回答

0

这里没有真正的答案。一些处理器的指令给出了一些设置位(这对于通用编程来说是一个非常无用的指令,但对错误检测很有用)。假设你没有这样的指令,通常零是寄存器最有可能的价值,你应该专门测试。那么你不得不求助于数位。基本算法是与AND相加,将结果添加到累加器,右移,并与一个,并重复,直到你有所有的位。或者因为你想要零位,XOR与1.但是我们可能会加快速度。你可以采取8位并做一个查询。但是比8点钟更快还是更慢呢?它只取决于特定的指令集,内存缓存等。如果我们有一个“寄存器文件”,通过索引号识别寄存器,我们可以设置寄存器0为4,寄存器1为3,寄存器2为3,寄存器3为2等等(16个寄存器的计数为零位),输出4位,然后使用结果来索引寄存器文件。你需要做几个来证明这个开销。

另一个问题是循环或展开会更快。这又是高度依赖于架构的。

然后另一个可能的窍门是,如果MSB被设置,则该数字为负数。对于负数的测试是否比AND更快?很有可能。另一种情况是,乘以2或加上它本身可能会设置进位标志,并且加进零可能会比加进寄存器更快。

有很多可能的小策略。