September 15, 2023

Перевод из десятичной системы счисления в двоичную на Leo.

Всем привет! В данной статье мы напишем программу на языке программирования Leo, которая переводит поступившее число из десятичной системы счисления в двоичную. Если вы не читали мои предыдущие статьи и видео, рекомендую с ними ознакомиться. У меня много контента по языку Leo, а также по проекту Aleo.

Данная статья есть в видео-формате по ссылке.

Для начала немного теории. Как перевести число из десятичной системы в двоичную?

Мы берем число, например, 10, и начинаем делить его на 2, сохраняя остаток до того момента, пока число не станет 1 или 0. Потом эти остатки мы записываем в обратном порядке. На картинке выше представлен более наглядный алгоритм действий.

Давайте реализуем этот расчет на языке программирования Leo. Для этого открываем Aleo Studio и создаем новый проект.

Пропишем вход и выход функции. Мы будем принимать и выводить число типа u64. Несмотря на то, что на выходе должно быть двоичное число, по сути, мы лишь показываем двоичную запись числа, записанную в десятичную переменную. Поэтому рекомендую выбирать именно формат u64 и выше, чтобы можно было преобразовать более большие числа.

transition main(a: u64) -> u64 {

Следующим шагом создаем переменную в которой будем хранить остатки от деления числа. Мы зададим ей значение 1, так как первый остаток может быть и 0 и 1, если будет 0, то мы потеряем его. Поэтому мы добавляем в начало 1, которую мы потом уберем.

let result: u64 = 1u64;

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

let rev: u64 = 0u64;

Поскольку в leo нет цикла while, мы вынуждены использовать связку цикла for и условного оператора if.

for i:u64 in 0u64..10u64 { if a > 0u64{

Мы можем перевести максимум 10ти значное число (если необходимо больше, то можно увеличить количество циклов в for). И если a>0, мы выполняем следующее:

result = result * 10u64 + a.rem(2u64);

В переменную result записываем остатки от деления числа на 2 каждый раз в новый разряд (для этого умножаем на 10).

a = a / 2u64;

Делим саму переменную a на 2 для продолжения логики алгоритма.

Таким образом по результатам работы цикла ниже, мы получим число 1 + остатки от деления на 2. На примере 10, это было бы 10101. Теперь нам осталось перевернуть число и убрать первую единицу.

for i:u64 in 0u64..10u64 { if a > 0u64{ result = result * 10u64 + a.rem(2u64); a = a / 2u64; } }

Для этого по той же логике пишем цикл for и оператор if со следующим содержанием:

for i:u64 in 0u64..10u64 { if result >= 10u64 { rev = rev * 10u64 + result.rem(10u64); result = result / 10u64; } }

Мы пишем result >= 10u64 для того чтобы избавиться от 1 в начале. С помощью алгоритма выше, мы переворчаваем наше число. Осталось лишь вывети переменную rev.

return rev;

Весь код имеет следующий вид:

program tentotwo.aleo { transition main(a: u64) -> u64 { let result: u64 = 1u64; let rev: u64 = 0u64; for i:u64 in 0u64..10u64 { if a > 0u64{ result = result * 10u64 + a.rem(2u64); a = a / 2u64; } } for i:u64 in 0u64..10u64 { if result >= 10u64 { rev = rev * 10u64 + result.rem(10u64); result = result / 10u64; } } return rev; } }

Осталось вписать входные данные и запустить программу.

Мы должны получить результат 1010.

Мы получили корректный результат. Давайте загрузим код в ChatGPT и проверим, поймет ли он суть программы, а также прочитаем объяснение.

Данная программа на языке программирования ALEO представляет собой конвертер числа из десятичной системы счисления в двоичную систему счисления. Давайте разберем суть программы шаг за шагом:

  1. Программа объявляет функцию main, которая принимает аргумент a типа u64 (беззнаковое 64-битное целое число) и возвращает результат также типа u64.
  2. let result: u64 = 1u64;: Объявляется переменная result типа u64 и инициализируется значением 1. Эта переменная будет использоваться для хранения числа в двоичной системе.
  3. let rev: u64 = 0u64;: Объявляется переменная rev типа u64 и инициализируется значением 0. Эта переменная будет использоваться для хранения перевернутой версии числа в двоичной системе.
  4. Первый цикл for: Этот цикл будет выполняться 10 раз (для каждой цифры в десятичном числе), пока значение a больше нуля. Внутри цикла:
    • Цифра текущего разряда числа a в двоичной системе вычисляется как a.rem(2u64) (остаток от деления на 2).
    • Затем эта цифра добавляется к переменной result, умноженной на 10, чтобы "сдвинуть" все цифры влево и добавить новую цифру справа.
    • Затем значение a делится на 2, чтобы перейти к следующему разряду.
  5. Второй цикл for: Этот цикл выполняется, пока значение result больше или равно 10. Внутри цикла:
    • Цифра текущего разряда числа result вычисляется как result.rem(10u64) (остаток от деления на 10).
    • Эта цифра добавляется к переменной rev, умноженной на 10, чтобы построить перевернутую версию числа.
    • Затем значение result делится на 10, чтобы удалить обработанный разряд.
  6. На выходе функция возвращает значение переменной rev, которое представляет перевернутое двоичное представление исходного десятичного числа.

Таким образом, программа принимает десятичное число, конвертирует его в двоичное.

Итог

Не перестаю удивляться ChatGPT. Порою он действительно очень четко преподносит информацию и одолевает меня на "преподавательском" поле. Надеюсь, данная статья была для вас полезна. До встречи!