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

时间:2015-01-27 09:00:20

标签: common-lisp sbcl

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

2 个答案:

答案 0 :(得分:6)

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

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

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

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

> (setq *write-base* 2)
10
> (setq *print-base* 2)
10
> (+ 11 01)
100

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

> (setq *read-base* 1010)
1010
> 5
101
> (setq *print-base* 10)
10
> 5
5

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

> (+ #b11 #b01)
4

答案 1 :(得分:2)

This article建议用#b为数字加前缀将告诉编译器/解释器将它们视为二进制数。

来自文章:

#b10101 ==> 21