我想採用一個無符號整數表示值,並以某種方式使用浮點運算,執行向右旋轉按位旋轉操作。使用浮點運算對整數數據旋轉右操作?
看看這裏使用的巧妙:http://en.wikipedia.org/wiki/Fast_inverse_square_root 這使用了一個魔術值和一些技巧,使用整數運算對浮點數執行操作。我想要的是相反的;我正在使用的硬件針對浮點進行了大量優化,但整數運算性能較差。該算法是sha256,它大量使用旋轉右操作。
我想採用一個無符號整數表示值,並以某種方式使用浮點運算,執行向右旋轉按位旋轉操作。使用浮點運算對整數數據旋轉右操作?
看看這裏使用的巧妙:http://en.wikipedia.org/wiki/Fast_inverse_square_root 這使用了一個魔術值和一些技巧,使用整數運算對浮點數執行操作。我想要的是相反的;我正在使用的硬件針對浮點進行了大量優化,但整數運算性能較差。該算法是sha256,它大量使用旋轉右操作。
兩種方法浮現在腦海中:
第一個選項不太可能奏效。如果您的硬件基於IEEE 754浮點標準(最常見的浮點表示標準),則浮點數將存儲爲位域;例如,double有一個符號位,11個指數位和53個小數位。不會有任何操作將符號位的值轉換爲指數位插槽之一。然後有一些位模式具有特殊的含義,並且貫穿整個操作的意義,如NaN和無窮。所以這個想法可能是一個不起眼的東西。
我不相信第二種方法也可以;你需要完全控制四捨五入等行爲,並希望說服自己在浮點值中有適當數量的位,並且你絕對需要大量測試來證明自己正在獲得全系列投入的預期產出。但是在這裏。
一個向右旋轉的操作 - 比如x ror y - 因此發生故障。設b是x中的位數。我假設一切都使用無符號算術完成,因爲它使邏輯更簡單。
x ror y
開始。(x shr y) or (x shl (b - y))
。floor(x/2^y) or (x shl (b - y))
。floor(x/2^y) or ((x * 2^(b - y)) mod 2^b)
。floor(x/2^y) + ((x * 2^(b - y)) mod 2^b)
。現在只需在每個地方插入該公式SHA256執行旋轉右移操作,並查看它是否比整數算術更快。似乎不太可能,但並非不可能 - 即使整數硬件沒有快速移位,添加兩個具有不同指數的浮點數也需要FP硬件內的快速移位操作。