球拍二进制加法

时间:2018-12-04 22:35:54

标签: binary sum racket addition

我有一个关于球拍的问题。 给定2个字符串二进制数,我想以字符串二进制数获取它们的总和。该功能应考虑进位和可能的溢出。 因此该函数应如下所示:

(define (binary-sum a b) ...)

例如:

(binary-sum "010" "001")

"011"

或者:

(binary-sum "0010" "1011")

"1101"

或者在发生溢出的情况下:

(binary-sum "1111" "0001")

"overflow"

请确定我需要的任何包裹。

谢谢!

1 个答案:

答案 0 :(得分:1)

使用前缀#b指定Racket中的二进制值。使用它,我们可以创建以下功能:

> (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