Составить рекурсивную функцию, которая выводит на экран двоичный код целого числа - C (СИ)
Формулировка задачи:
Задание 5. Составить рекурсивную функцию, которая выводит на экран двоичный код целого числа.
Решение задачи: «Составить рекурсивную функцию, которая выводит на экран двоичный код целого числа»
textual
Листинг программы
#include <stdio.h> #include <limits.h> _Bool print_bin_rec(unsigned v, unsigned n, _Bool has_digits) { if (v == 0) { if (has_digits) printf("%0*d", (int) n, 0); } else if (n == 1) { printf("%d", 1); has_digits = 1; } else { unsigned n_hi = n / 2, n_lo = n - n_hi, hi = v >> n_lo, lo = v - (hi << n_lo); has_digits = print_bin_rec(hi, n_hi, has_digits) || has_digits; has_digits = print_bin_rec(lo, n_lo, has_digits) || has_digits; } return has_digits; } void print_bin(unsigned v) { if (!print_bin_rec(v, sizeof(unsigned) * CHAR_BIT, 0)) printf("0"); printf("\n"); } int main(void) { print_bin(127); return 0; }
Объяснение кода листинга программы
В данном коде реализована рекурсивная функция print_bin_rec, которая выводит на экран двоичный код целого числа. Список действий:
- Если значение переменной v равно 0, то выполняется блок кода, который выводит на экран двоичный ноль (0) с заданным количеством десятичных разрядов (n).
- Если значение переменной n равно 1, то выполняется блок кода, который выводит на экран число 1.
- Если ни одно из предыдущих условий не выполнено, то выполняется следующий блок кода: a. Значение переменной n делится на 2, результатом чего является значение переменной n_hi. b. Значение переменной n вычитается из значения переменной n_hi, результатом чего является значение переменной n_lo. c. Слово v сдвигается вправо на значение переменной n_lo (наиболее значимые разряды переходят в младшие), результатом чего является значение переменной hi. d. Слово v вычитается из значения переменной hi, умноженного на 2 в степени n_lo (наиболее значимые разряды переходят в младшие), результатом чего является значение переменной lo. e. Рекурсивная функция print_bin_rec вызывается для значения hi и n_hi с текущим значением has_digits. f. Рекурсивная функция print_bin_rec вызывается для значения lo и n_lo с текущим значением has_digits. g. Результат выполнения рекурсивных функций сравнивается с 0. Если хотя бы одна из функций вернула true, то значение переменной has_digits устанавливается в 1.
- В функции main() вызывается функция print_bin с аргументом 127.
- Если значение переменной has_digits в функции print_bin равно 0 после вызова print_bin_rec, то выводится двоичный ноль (0).
- Выводится символ новой строки (\n).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д