Вопрос по Си


Re2sgsII

Пользователь
Форумчанин
Регистрация
06.10.2015
Сообщения
45
Репутация
3
вот смотри двоичная там 128 ,а вот 8-ная и 16-ричная какая ?
 

admz

Пользователь
Форумчанин
Регистрация
24.02.2017
Сообщения
17
Репутация
3
лично я - не понял вопрос
 

Re2sgsII

Пользователь
Форумчанин
Регистрация
06.10.2015
Сообщения
45
Репутация
3
Код:
#include <stdio.h>

int main ()
{
    int cislo;
    int dvo = 128 ;
    printf("Введите число \n");
    scanf("%d", &cislo);
     for (int i = 1; i <= 8; i++) {
             if (cislo >= dvo) {
                 printf("1");
                 cislo -= dvo;
             } else
                 printf("  \n");
             dvo /= 2;
         }
 return 0;
}
 

admz

Пользователь
Форумчанин
Регистрация
24.02.2017
Сообщения
17
Репутация
3
ок, давай по порядку
пользователь вводит число в десятичной системе
задача: получить массив символов введенного числа в двоичном виде, полученный массив вывести на экран.
 

admz

Пользователь
Форумчанин
Регистрация
24.02.2017
Сообщения
17
Репутация
3
Для перевода чисел из десятичной системы счисления в двоичную используют так называемый "алгоритм замещения", состоящий из следующей последовательности действий:

  1. Делим десятичное число А на 2. Частное Q запоминаем для следующего шага, а остаток a записываем как младший бит двоичного числа.
  2. Если частное q не равно 0, принимаем его за новое делимое и повторяем процедуру, описанную в шаге 1. Каждый новый остаток (0 или 1) записывается в разряды двоичного числа в направлении от младшего бита к старшему.
  3. Алгоритм продолжается до тех пор, пока в результате выполнения шагов 1 и 2 не получится частное Q = 0 и остаток a = 1.

Например, требуется перевести десятичное число 247 в двоичное. В соответствии с приведенным алгоритмом получим:

24710 : 2 = 12310
24710
- 24610 = 1, остаток 1 записываем в МБ двоичного числа.
12310 : 2 = 6110
12310
- 12210 = 1, остаток 1 записываем в следующий после МБ разряд двоичного числа.
6110 : 2 = 3010
6110
- 6010 = 1, остаток 1 записываем в старший разряд двоичного числа.
3010 : 2 = 1510
3010
- 3010 = 0, остаток 0 записываем в старший разряд двоичного числа.
1510 : 2 = 710
1510
- 1410 = 1, остаток 1 записываем в старший разряд двоичного числа.
710 : 2 = 310
710
- 610 = 1, остаток 1 записываем в старший разряд двоичного числа.
310 : 2 = 110
310
- 210 = 1, остаток 1 записываем в старший разряд двоичного числа.
110 : 2 = 010, остаток 1 записываем в старший разряд двоичного числа.

Таким образом, искомое двоичное число равно 111101112.


источник
 

admz

Пользователь
Форумчанин
Регистрация
24.02.2017
Сообщения
17
Репутация
3
1. Последовательно записываете остатки от деления на два (в массив символов где будет результат),
2. Переворачиваете массив

пример:
число 19:
19/2 = 9; остаток 1 (записываем как первый элемент массива )
9/2 = 4; остаток 1 (записываем как второй элемент массива )
4/2 = 2; остаток 0 (записываем как третий элемент массива )
2/2 = 1; остаток 0 (записываем как четвертый элемент массива )
1/2 = 0; остаток 1 (записываем как пятый элемент массива )

как только дошли до 0 - конец цикла

получили в массиве последовательность 11001 записываем в обратном порядке,
(для понимания, просто сделайте еще один массив для результата, не нужно пока себя ограничивать в количестве переменных)
на входе массив 11001 перевернули и получили 10011, что собственно и будет результатом

19(dec) == 10011(bin)
 

admz

Пользователь
Форумчанин
Регистрация
24.02.2017
Сообщения
17
Репутация
3
Удобнее всего это делать в цикле while, переворачивать массив удобней в for.
Вас никто не ограничивает в количестве памяти или количестве циклов/операторов.
лучше написать поэтапно разными циклами и с массивами под каждый этап.
как только Вы реализуете алгоритм - не большая модификация (замена делителя) даст возможность переводить в любую систему которая меньше десятичной.
для понимания - лучше начать с двоичной.
 
Верх Низ