任何Word32
數目可如下表達爲Word8
號的線性組合:性能改進作用
x = a + b * 2^8 + c * 2^16 + d * 2^24
換句話說,這是在鹼的2^8
的x
表示。爲了獲得這些因素,我實現了以下功能:
word32to8 :: Word32 -> (Word8,Word8,Word8,Word8)
word32to8 n = (fromIntegral a,fromIntegral b,fromIntegral c,fromIntegral d)
where
(d,r1) = divMod n (2^24)
(c,r2) = divMod r1 (2^16)
(b,a) = divMod r2 (2^8)
它工作正常,但由於我的程序正在使用此功能一堆的時候,我還以爲你們可以給我如何改善的想法(如果可能)執行此操作。任何小小的改進對我來說都是好的,無論是在時間還是空間上。對我來說,它看起來非常簡單,以至於無法實現性能提升,但我仍然想問這個問題,以防萬一我缺少某些東西。
順便說一下,我對fromIntegral
的所有重複感到惱火,但轉換是必要的,因此類型可以匹配。
在此先感謝。
我認爲一個更快但可能不太便攜的pproach將使用'Word32'的'Storable'實例來訪問底層的字節級表示,然後直接從中讀取所有四個字節。 –
@GabrielGonzalez:這可能比4'divMod's更快,但它絕對不是最佳選擇。使用'可存儲'意味着分配一個新的內存塊,複製到它並回讀。 @ ertes的解決方案將避免額外的分配和複製。 –