我有一个关于 Racket 的问题。 给定 2 个字符串二进制数,我想以字符串二进制数形式获取它们的和。该函数应考虑进位和可能的溢出。 所以这个函数应该是这样的:
(define (binary-sum a b) ...)
例如:
(binary-sum "010" "001")
"011"
或者:
(binary-sum "0010" "1011")
"1101"
或者在溢出的情况下:
(binary-sum "1111" "0001")
"overflow"
请确定我需要的任何软件包。
谢谢!
最佳答案
Racket 中的二进制值使用前缀 #b
指定。使用它,我们可以创建以下函数:
> (define (binary-sum a b)
(+ (string->number (string-append "#b" a))
(string->number (string-append "#b" b))))
> (binary-sum "010" "001")
3
要将输出格式化为二进制,我们可以使用 ~r
,如下所示:
> (define (binary-sum a b)
(~r (+ (string->number (string-append "#b" a))
(string->number (string-append "#b" b))) #:base 2))
> (binary-sum "010" "001")
011
最后,要添加溢出功能,我们可以简单地将结果作为字符串的长度与其中一个参数的长度进行比较。
(define (binary-sum a b)
(let ((sum (~r (+ (string->number (string-append "#b" a))
(string->number (string-append "#b" b)))
#:base 2)))
(if (> (string-length sum)
(string-length a))
"overflow"
sum)))
其行为与您的问题指定的完全相同。如果您还有任何疑问或困惑,请告诉我。祝你好运!
编辑:只是想注意,如果您只需要添加两个二进制值并且不介意返回一个整数,那么您总是可以这样做:
> (+ #b010 #b001)
3
关于binary - Racket 二进制加法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53622472/