如何用二进制数读、写和计算?
How to read, write, and compute with binary numbers?
我正在用 SBCL 开发一个计算器,想接受和显示二进制数字。 Common Lisp 默认的读写都是以 10 为底(即十进制)。有没有办法轻松读写二进制数字?如果是这样,我是否需要使用不同的算术函数来处理它们?
This article 建议在数字前加上#b 将告诉 compiler/interpreter 将它们视为二进制数。
来自文章:
#b10101 ==> 21
在内存中,每个数字都是二进制的。您只是在计算器中处理不同的数字表示形式。
当您读取表达式时,只需将二进制数字文字转换为普通的 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*
变量来更改 LISP 解释器如何读取和打印数字的默认基础:
> (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
我正在用 SBCL 开发一个计算器,想接受和显示二进制数字。 Common Lisp 默认的读写都是以 10 为底(即十进制)。有没有办法轻松读写二进制数字?如果是这样,我是否需要使用不同的算术函数来处理它们?
This article 建议在数字前加上#b 将告诉 compiler/interpreter 将它们视为二进制数。
来自文章:
#b10101 ==> 21
在内存中,每个数字都是二进制的。您只是在计算器中处理不同的数字表示形式。
当您读取表达式时,只需将二进制数字文字转换为普通的 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*
变量来更改 LISP 解释器如何读取和打印数字的默认基础:
> (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