[英]Add with carry on Word8
我找不到一個函數addWithCarry :: Word8 -> Word8 -> (Word8, Bool)
已在base
定義。 在GHC.Prim
,唯一記錄為關心addIntC#
函數似乎是addIntC#
,但似乎永遠不會通過各種抽象層向上推動。
我可以通過測試輸出值是否在范圍內並且實際上是我當前正在做的事情來展示我自己的但我寧願重用(可能更有效)已經定義的那個。
有這樣的事嗎?
如果您查看Word8的Num實例的源代碼 ,您將看到所有內容都是通過轉換為Word#
unboxed值並對其執行操作,然后縮小到8位值來完成的。 我懷疑對Word#
值進行比較會更有效率,所以我實現了這樣的事情。 它可以在lpaste上使用 (我發現它比StackOverflow更容易閱讀)。
請注意,它包括測試套件和Criterion基准。 在我的系統中,所有各種測試對於盒裝版本(user5402的實現)需要~31ns,對於primops版本需要~24ns。
來自lpaste的重要功能是primops
,它是:
primops :: Word8 -> Word8 -> (Word8, Bool)
primops (W8# x#) (W8# y#) =
(W8# (narrow8Word# z#), isTrue# (gtWord# z# 255##))
where
z# = plusWord# x# y#
一種方法是:
addWithCarry :: Word8 -> Word8 -> (Word8, Bool)
addWithCarry x y = (z, carry)
where z = x + y
carry = z < x
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.