对于整数(32位或4字节),我可以这样做:
(defun get-u4 (arr pos)
(let ((u4 0))
(setf (ldb (byte 8 0) u4) (aref arr pos))
(setf (ldb (byte 8 8) u4) (aref arr (+ pos 1)))
(setf (ldb (byte 8 16) u4) (aref arr (+ pos 2)))
(setf (ldb (byte 8 24) u4) (aref arr (+ pos 3)))
u4))
(defun put-u4 (arr pos int)
(setf (aref arr pos) (ldb (byte 8 0) int))
(setf (aref arr (+ pos 1)) (ldb (byte 8 8) int))
(setf (aref arr (+ pos 2)) (ldb (byte 8 16) int))
(setf (aref arr (+ pos 3)) (ldb (byte 8 24) int)))但是,我不知道如何对64位或8字节双浮点数执行此操作?小恩典是假设的。
=============
我找到了一个解决方案(使用外部库);https://www.quicklisp.org/beta/UNOFFICIAL/docs/ieee-floats/doc/index.html使用这个解决方案,我可以用适当的大小对整数进行双浮动编码/解码。
发布于 2015-09-18 13:20:01
从维基百科我们得到了这


您可以使用quicklisp获得注释中提到的库:
CL-USER> (ql:quickload 'ieee-floats)
To load "ieee-floats":
Install 1 Quicklisp release:
ieee-floats
; Fetching #<URL "http://beta.quicklisp.org/archive/ieee-floats/2015-06-08/ieee-floats-20150608-git.tgz">
; 4.92KB
==================================================
5,041 bytes in 0.01 seconds (378.68KB/sec)
; Loading "ieee-floats"
[package ieee-floats]
(IEEE-FLOATS)
CL-USER> (ieee-floats:encode-float32 23d2)
1158660096
CL-USER> (ieee-floats:decode-float32 #b010101)
2.9427268e-44
CL-USER> (ieee-floats:encode-float32 0)
; Evaluation aborted on #<TYPE-ERROR expected-type: FLOAT datum: 0>.
CL-USER> (ieee-floats:encode-float32 0.0)
0
CL-USER> (ieee-floats:encode-float32 0.1)
1036831949当然,您可以使用iee-floats:编码/解码-浮动64当然,
您还需要知道#b 010101是一个宏,它用普通的lisp表示在普通数学中可以使用的二进制数:
CL-USER> (+ 2 #b10)
4因此,它为您将二进制转换为整数,然后您也可以使用格式的实用程序。
(format nil "~B" 2)
"10",您可以使用它将整数转换为二进制字符串,最后,您可以注意的唯一一件事是二进制数字之前的0自动完成,ieee库将它们移除用于表示形式。
CL-USER> (ieee-floats:encode-float64 1.0d0)
4607182418800017408
CL-USER> (format nil "~B" *)
"11111111110000000000000000000000000000000000000000000000000000"
CL-USER> (length *)
62
CL-USER> (ieee-floats:encode-float64 -1.0d0)
13830554455654793216
CL-USER> (format nil "~B" *)
"1011111111110000000000000000000000000000000000000000000000000000"
CL-USER> (length *)
64
CL-USER> (ieee-floats:decode-float64 #b11111111110000000000000000000000000000000000000000000000000000 )
1.0d0
CL-USER> (ieee-floats:decode-float64 #b1011111111110000000000000000000000000000000000000000000000000000 )
-1.0d0
CL-USER> (ieee-floats:decode-float64 #b0011111111110000000000000000000000000000000000000000000000000000 )
1.0d0有了这个,你就可以进行所有需要的转换,祝你好运。
https://stackoverflow.com/questions/32622427
复制相似问题