我有一个包含大量数据的 (unsigned-byte 32)
数组,其中一些是浮点格式。也就是说,一些字节被处理为包含位字段的整数,而另一些是 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
的位内容作为浮点数的位内容吗?