我有一個(unsigned-byte 32)
數組,其中包含相當多的數據,其中一些是浮點格式。也就是說,一些字節是作爲包含位字段的整數來處理的,而其中一些字節是32位浮點數。sbcl:將(無符號字節32)轉換爲單浮點數
我需要讀取和寫入數組中的數據。
不幸的是,該功能sb-kernel:make-single-float
需要在(signed-byte 32)
參數,並sb-kernel:single-float-bits
返回一個符號字一樣,所以他們不是我的矢量直接兼容。另一方面,將矢量轉換爲包含帶符號字節會使位域操作變得痛苦。
這一步,我已經寫了
(defun u32-to-sf (x)
(declare (optimize (speed 3) (compilation-speed 0) (debug 0))
(type (unsigned-byte 32) x))
(if (>= x #x80000000)
(sb-kernel:make-single-float (- x #x100000000))
(sb-kernel:make-single-float x)))
它執行正確的事情,但生成的程序集看起來醜陋的條件跳轉和不必要的比較和減法。
有關如何說服sbcl只接受unsigned-byte
的按位內容作爲要浮動的按位內容的任何想法?
確實,這確實會產生正確的彙編代碼。當然,在這種情況下,整個「if」是不必要的。但是,再次,這是一個有點駭人聽聞的解決方案,雖然它與當前版本一起工作,但我認爲通常認爲它將來也可以工作通常是安全的。但是,暫時足夠了 - 謝謝! – jlahd