如何使用二进制数读取,写入和计算?

I-K*_*Kod 2 sbcl common-lisp

我正在开发一个带有SBCL的计算器,并希望接受并显示二进制数字.Common Lisp的默认读写使用基数10(即十进制).有没有办法轻松读取和写入二进制数字?如果是这样,我是否需要使用不同的算术函数来处理它们?

cbl*_*ley 6

在内存中,每个数字都是二进制的.您只需处理计算器中不同的数字表示.

当您读取表达式时,只需将二进制数字文字转换为普通的lisp数字,计算表达式的值,然后以您喜欢的任何表示形式打印出结果.

> (setq result (+ (parse-integer "11" :radix 2)
                  (parse-integer "01" :radix 2)))
4
> (write-to-string result :base 2)
100
Run Code Online (Sandbox Code Playgroud)

话虽这么说,您也可以通过分别设置*read-base**print-base*变量来更改LISP解释器读取和打印数字的默认基础:

> (setq *write-base* 2)
10
> (setq *print-base* 2)
10
> (+ 11 01)
100
Run Code Online (Sandbox Code Playgroud)

注意,为了切换回正常的十进制数,您还必须以二进制形式输入数字,直到您*read-base*再次更改为止:

> (setq *read-base* 1010)
1010
> 5
101
> (setq *print-base* 10)
10
> 5
5
Run Code Online (Sandbox Code Playgroud)

最后,您可以使用特殊的读取语法来读取10以外的数字:

> (+ #b11 #b01)
4
Run Code Online (Sandbox Code Playgroud)