Scheme/Lisp中的内置二进制转换

Scheme/Lisp中的内置二进制转换,scheme,lisp,Scheme,Lisp,Scheme中是否有内置的二进制到十进制转换函数 我找到了内置的number->string转换,它可以将二进制转换为十进制 然而,相反的string->number并不像我想的那样将小数转换成二进制字符串 是否有内置函数或我们必须定义它?函数接受可选的基数参数: (string->number "1001" 2) ==> 9 二进制和十进制是数字的表示形式;数字本身不是二进制或十进制的 number->string将数字(如12)转换为字符串(如“12”),默认情况下输出数字的基

Scheme中是否有内置的二进制到十进制转换函数

我找到了内置的
number->string
转换,它可以将二进制转换为十进制

然而,相反的
string->number
并不像我想的那样将小数转换成二进制字符串


是否有内置函数或我们必须定义它?

函数接受可选的
基数
参数:

(string->number "1001" 2)
==> 9

二进制和十进制是数字的表示形式;数字本身不是二进制或十进制的

number->string
将数字(如12)转换为字符串(如“12”),默认情况下输出数字的基数10表示形式。
(它不会从二进制转换为十进制-它的名称描述了它的功能。)

string->number
将字符串(如“12”)转换为数字(如12),默认情况下将字符串解释为数字的10进制表示形式。
(此函数的名称还描述了它的功能。)

对于不同的基表示(2、8、10或16),可以将第二个参数传递给这两个函数

要获取以二进制形式表示的数字
n
,请使用
(数字->字符串n2)

要从字符串
s
及其二进制表示形式中获取数字,请使用
(字符串->数字s2)

示例:

> (number->string 120)
"120"
> (string->number "120")
120
> (number->string 120 2)
"1111000"
> (string->number "1111000" 2)
120
> (number->string 120 16)
"78"
> (string->number "78" 16)
120

这段代码是用麻省理工学院的scheme编写的。在其他具有静态作用域的lisp版本中,它也应该可以工作,如果缺少这样一个函数,您可以提供
char->digit
的实现

(define string->number
  (lambda (ibase)
    (lambda (str)
      ((lambda (s) (s s (map (lambda (a) (char->digit a ibase)) (string->list str)) 0))
       (lambda (s input n)
         (if (null? input)
             n
             (s s (cdr input)
                (+ (car input) (* n ibase)))))))))

(define str.convert.base.16 (string->number 16))
(define str.convert.base.10 (string->number 10))
(define str.convert.base.2 (string->number 2))
(define str.convert.base.3 (string->number 3))

(str.convert.base.10 "1001")
(str.convert.base.2 "1001")
(str.convert.base.3 "1001")
(str.convert.base.16 "100")
麻省理工学院计划的成果:

1]=>(str.convert.base.10“1001”);价值:1001

1]=>(str.convert.base.2“1001”);数值:9

1]=>(str.convert.base.3“1001”);价值:28

1]=>(str.convert.base.16“100”);数值:256

公共口齿不清 和Scheme一样,数字在CommonLisp中也没有基,只有它们的表示形式

使用以下方法可视化基数中的数字:

(写入字符串10:base 2)
; ==> "1010"
使用以下方法读取以某个基数表示的数字:

(解析整数“1010”:基数2)
; ==> 10
; ==> 4(解析器终止的索引)
(解析整数“1010.1”:基数2)
; 解析整数:子字符串“1010.1”在位置4处没有整数语法
(解析整数“1010.1”:基数2:t)
; ==> 10
; ==> 4(解析器终止的索引)
或者,您可以使用读卡器/打印机,但是,如果下一个标记不能解释为浮点,则只能读取:

(let((*print base*2))
(第一至第十串)
; ==> "1010"
(let((*读取基数*2))
(从字符串“1010”读取)
; ==> 10
; ==> 5.
;; *当解释为浮点时,已忽略读取基数*
(let((*读取基数*2))
(从字符串“1010.1”读取)
; ==> 1010.1
; ==> 6.
我假设全局和都是10。
从字符串读取
不关心数字后面是否有垃圾,因此它的行为类似于
(解析整数“1010”:基数2:允许垃圾t)

作为已读基本文档的附加信息。您可以告诉读取器以2、8和16为基数的文字以及覆盖动态设置的任意文字:

#b1010;==>10(基数2)
#o1010;==>520(基数8)
#x1010;==>4112(基数16)
#3r1010;==>30(基数3)
#36RTOBEORNOTOBE;==>140613689159812836698(底座36)

char->digit
不是Scheme报告的一部分,因此您的代码将只在Scheme的tha
mit Scheme
方言中工作,而不会在其他方言中工作。该问题没有
mit scheme
标记。标准程序:
(字符串->数字“100”16);=>256
。直接取自R5RS报告的示例,适用于之后的所有报告。@Sylvester我不确定您的意思,但可以使用((字符串->数字16)“100”)获得256。如果您在某些实现中没有
char->digit
请随意实现它。
char->digit
不是Scheme编程语言的一部分。您应该在回答中提供非标准过程的实现。@Sylvester我在这里工作没有报酬;)我只提供了一个简短的回答。。。我认为每个初学者都能实现它。另外,任意基数(从2到36)的读取器语法:
\36rtobebebeornottobe
@coredump我完全没有想到这一点。喜欢:)在使用阅读器处理您不能完全控制的数据时要非常小心,例如用户输入。可以将事情设置为至少应该是安全的,但是默认配置允许代码注入攻击。