Бинарное сложение ракетки - PullRequest
       33

Бинарное сложение ракетки

0 голосов
/ 05 декабря 2018

У меня вопрос по поводу Ракетки.Учитывая 2 строковых двоичных числа, я хотел бы получить их сумму в строковом двоичном числе.Функция должна учитывать биты переноса и возможное переполнение.Таким образом, функция должна выглядеть так:

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

Например:

(binary-sum "010" "001")

"011"

Или:

(binary-sum "0010" "1011")

"1101"

Или в случае переполнения:

(binary-sum "1111" "0001")

"overflow"

Пожалуйста, укажите все необходимые мне пакеты.

Спасибо!

1 Ответ

0 голосов
/ 05 декабря 2018

Двоичные значения в 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
...