【问题标题】:How to read, write, and compute with binary numbers?如何用二进制数读、写和计算?
【发布时间】:2015-01-27 09:00:19
【问题描述】:

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

【问题讨论】:

  • 您使用的是哪种 LISP 方言?
  • 我正在为 SB-thread 使用 SBCL

标签: common-lisp sbcl


【解决方案1】:

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

当您阅读表达式时,只需将二进制数字文字转换为普通的 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

【讨论】:

    【解决方案2】:

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

    来自文章:

    #b10101 ==> 21
    

    【讨论】:

    • 也可以使用 (format t "~B" 123) 以二进制形式打印一个数字。此评论中的示例给出 1111011
    猜你喜欢
    • 1970-01-01
    • 2015-09-12
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 2022-03-24
    相关资源
    最近更新 更多