Как читать, писать и вычислять двоичные числа?

Я разрабатываю калькулятор с SBCL и хочу принимать и отображать числа в двоичном формате. Чтение и запись Common Lisp по умолчанию использует основание 10 (т. е. десятичное число). Есть ли способ легко читать и записывать числа в двоичном формате? Если да, нужно ли мне использовать разные арифметические функции для работы с ними?


person I-Kod    schedule 27.01.2015    source источник
comment
Какой диалект LISP вы используете?   -  person Tom    schedule 27.01.2015
comment
Я использую SBCL для SB-потока   -  person I-Kod    schedule 27.01.2015


Ответы (2)


В этой статье предполагается, что добавление префикса #b к числам скажет компилятор/интерпретатор для обработки их как двоичных чисел.

Из статьи:

#b10101 ==> 21
person Tom    schedule 27.01.2015
comment
Также используйте (format t ~B 123) для печати числа в двоичной форме. Пример в этом комментарии дает 1111011 - person Baggers; 02.02.2015

В памяти каждое число находится в двоичном формате. Вы просто имеете дело с разными представлениями чисел в своем калькуляторе.

Когда вы читаете свои выражения, просто преобразуйте литералы двоичных чисел в обычные числа lisp, вычислите значение выражения, а затем распечатайте результат в любом представлении, которое вам нравится.

> (setq result (+ (parse-integer "11" :radix 2)
                  (parse-integer "01" :radix 2)))
4
> (write-to-string result :base 2)
100

При этом вы также можете изменить базу по умолчанию для того, как интерпретатор LISP читает и печатает числа, установив переменную *read-base* или *print-base* соответственно:

> (setq *write-base* 2)
10
> (setq *print-base* 2)
10
> (+ 11 01)
100

Обратите внимание, чтобы вернуться к обычным десятичным числам, вы также должны вводить числа в двоичном формате, пока вы снова не измените *read-base*:

> (setq *read-base* 1010)
1010
> 5
101
> (setq *print-base* 10)
10
> 5
5

Наконец, вы можете использовать специальный синтаксис чтения для чтения чисел в системе счисления, отличной от 10:

> (+ #b11 #b01)
4
person cbley    schedule 27.01.2015