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