2016-10-02 94 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或加上它本身可能會設置進位標誌,並且加進零可能會比加進寄存器更快。

有很多可能的小策略。

相關問題