Перевод десятичного числа в двоичное на С++

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Lohovoz, 22 Oct 2009.

  1. Lohovoz

    Lohovoz Banned

    Joined:
    6 Oct 2009
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    Доброго времени суток всем, тут возникла задачка, - перевод десятичного числа в двоичное, по идее смысл я понял - в цикле число делится на 2 и возвращает остаток в ячейку массива, но хотелось бы решить эту задачу с помощью отдельной рекурсивной функции, я совсем новичок в программировании, если кому не сложно, подскажите :)
     
  2. scrat

    scrat кодер

    Joined:
    8 Apr 2007
    Messages:
    625
    Likes Received:
    541
    Reputations:
    3
    делаешь переменную-"извлекатель", которая изначально равна единице, потом в цикле делаешь AND её и исходного числа, результат даст 1 или 0 в нужном разряде, потом сдвигаешь извлекатель на единицу вправо.
     
    1 person likes this.
  3. [n]-c0der

    [n]-c0der Member

    Joined:
    3 Feb 2009
    Messages:
    83
    Likes Received:
    24
    Reputations:
    -1
    А зачем рекурсия?
    Code:
    long _10_to_2_(int x) {
    	
    	int i;
    	int mod;
    	long double_ = 0;
    
    	for (i = 0; x>0; i++) {
    	
    		mod =  x % 2;
    		x = (x - mod) / 2;
    		double_ += mod * pow((double)10,i);
    	}
    	return double_;
    
    }
     
  4. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    Code:
    v#include <iostream>
    #include <string>
    
    using namespace std;
    
    void fuck(const int num, string &snum){
    	if (num%2==0)
    		snum+="0";
    	else snum+="1";
    	if ((num/2)!=0) fuck(num/2, snum);
    	else return;
    }
    
    int main(){
    	string snum;
    	fuck(57, snum);
    	cout<<snum<<endl;
    }
    вот те и рекурсия. Только она малясь кривая, и итоговую бинарную запись задом наперед выводит. Ну думаю развернуть ты сам сможешь, если приспичет :)
     
  5. Espectro

    Espectro New Member

    Joined:
    9 Nov 2008
    Messages:
    11
    Likes Received:
    1
    Reputations:
    0
    вот нашел статейку думаю будет тебе полезна)
    Code:
    преобразовать десятичное число в двоичный вид на VC++?
    
    Ответ на этот вопрос мы и рассмотрим в этой статье. Мы будем использовать всем известный метод, нахождения двоичного представления десятичного числа – деление числа на 2. Все эти преобразования будут находиться в процедуре “Dec2Bin(int ch)”, где “ch”- число в десятичном представлении, которое собственно мы будем декодировать в двоичное. 
    
    До всего прочего нужно сначала объявить переменную “n” как константу: “const int n = 32;” Она отвечает за размерность массива “s[n]”, в который будет помещаться двоичное представление числа.
    И так, давайте рассмотрим процедуру “Dec2Bin(int ch)”, которая выполняет преобразование 10-го числа в 2-й вид. Что в этой процедуре мы делаем? 
    
    Наше число в 10-м виде делим на 2 с остатком и если при делении получается число с остатком, то в i-й элемент массива “s[i]” мы записываем число 1, в противном случае записываем 0. Этому числу “ch” приравниваем значение равное “ch”деленное на 2, эти действия выполняются пока число “ch” не будут равно нулю.
    
    Дальше проверяем, если наше 10-е число отрицательное инвертируем значения массива “s[n]”, т.е. число 1 заменяем на 0 и число 0 на 1. Это правило распространяется только на отрицательные числа. Затем приводим наш массив “s[n]” в нормальный вид, инвертируя значения до тех пор, пока ни встретится значение равное 0. В конце концов, прогоняя массив по циклу “for” выводим двоичное представление числа в 10-м виде. Вот и все, теперь посмотрите, что получилось:
    
    Процедура “Dec2Bin(int ch)”
    
    void Dec2Bin(int ch) {
    int i, ch2, s[n];
    ch2 = ch;
    for (i = 0; i < n; i++)
    s[i] = 0;
    for (i = 0; ch != 0; i++) {
    s[i] = abs(ch) % 2; //текущему значению массива s присваиваем 1 или 0
    ch = abs(ch) / 2;
    }
    if (ch2 < 0) {
    for (i = n - 1; i >= 0; i--)
    if (s[i] == 1)
    s[i] = 0;
    else
    s[i] = 1;
    }
    for (i = 0; i < n; i++)
    if (s[i] == 1) s[i] = 0;
    else {
    s[i] = 1;
    break;
    }
    }
    wcout << L"Двоичное представление :" << endl;
    for (i = n - 1; i >= 0; i--) //цикл вывода массива с введенным числом
    cout << s[i]; //представленным в двоичной системе счисления
    }
    
    Число в 2-м виде получили, но разве вам не хочется декодировать его обратно? Для начала напишем функции возведения числа в степень и получения длины массива, они нам понадобятся.
    
    Функция “len(char str[])”:
    
    int len(char str[])
    {
    int i = 0;
    while (str[i] != 0)
    i++;
    return i-1;
    }
    
    Функция “stepen(int ch, int st)”:
    
    int stepen(int ch, int st)
    {
    int a = 1;
    for(int i = 0; i < st; i++)
    a *= ch;
    return a;
    }
    
    Функция “len(char str[])” возвращает длину массива “str[]”, а “stepen(int ch, int st)” возводит число 2 в степень “st”.
    Теперь рассмотрим функцию “Bin2Dec (char m[])”, где “m[]”- это есть массив двоичных данных, в которых спрятано число. Если первый символ в массиве равен ‘1’, т.е. наше число отрицательное, то каждый символ в массиве до первой найденной ‘1’ инвертируем и после этого снова выполняет замену всех символов массива на ‘0’, если этот символ это ‘1’ или на ‘1’ соответственно. Затем непосредственно выполняем перевод в 10-й вид, используя нашу функцию возведения в степень. Код приведен ниже: 
    
    Функция “Bin2Dec (char m[])”:
    
    int Bin2Dec (char m[])
    {
    int i, deca=0, j = 0, q = 1;
    if (m[0] == '1')
    {
    for (i = n - 1; i >= 0; i--)
    if (m[i] == '0') m[i] = '1';
    else
    {
    m[i] = '0';
    break;
    }
    for (i = 0; i < n; i++)
    if (m[i] == '1')
    m[i] = '0';
    else
    m[i] = '1';
    q*=-1;
    }
    for (i = n - 1; i >= 0; i--, j++)
    if(m[i] == '1')
    deca += stepen(2,j);
    return deca*q;
    }
    
    Ну и, наконец, главная функция, с которой начинается работа нашего приложения. Здесь происходит ввод данных и вывод результата работы программы на экран пользователя.
    
    Главный метод:
    
    int main()
    {
    wcout.imbue(locale("rus_rus.866"));
    int ch;
    char c[n];
    wcout << L"Введите число (десятичное):" << endl; //вывод сообщения на экран
    cin >> ch; //ввод значения с клавиатуры
    Dec2Bin(ch);
    /*------------------------------------------------------------------------*/
    wcout << L"\n\nВведите число (двоичное):" << endl; //вывод сообщения на экран
    cin>>c; //ввод значения с клавиатуры
    wcout << L"Десятичное представление :" << endl << Bin2Dec(c) << endl; //выводим на экран число в 10-й системе счисления
    system("pause");
    return 1;
    }
    
    Используя данное приложение, вы с легкостью сможете переводить числа из десятичной системы счисления в двоичный вид и, наоборот, из двоичной системы счисления в десятичный вид. Желаю вам удачи!преобразовать десятичное число в двоичный вид на VC++?
    
    Ответ на этот вопрос мы и рассмотрим в этой статье. Мы будем использовать всем известный метод, нахождения двоичного представления десятичного числа – деление числа на 2. Все эти преобразования будут находиться в процедуре “Dec2Bin(int ch)”, где “ch”- число в десятичном представлении, которое собственно мы будем декодировать в двоичное. 
    
    До всего прочего нужно сначала объявить переменную “n” как константу: “const int n = 32;” Она отвечает за размерность массива “s[n]”, в который будет помещаться двоичное представление числа.
    И так, давайте рассмотрим процедуру “Dec2Bin(int ch)”, которая выполняет преобразование 10-го числа в 2-й вид. Что в этой процедуре мы делаем? 
    
    Наше число в 10-м виде делим на 2 с остатком и если при делении получается число с остатком, то в i-й элемент массива “s[i]” мы записываем число 1, в противном случае записываем 0. Этому числу “ch” приравниваем значение равное “ch”деленное на 2, эти действия выполняются пока число “ch” не будут равно нулю.
    
    Дальше проверяем, если наше 10-е число отрицательное инвертируем значения массива “s[n]”, т.е. число 1 заменяем на 0 и число 0 на 1. Это правило распространяется только на отрицательные числа. Затем приводим наш массив “s[n]” в нормальный вид, инвертируя значения до тех пор, пока ни встретится значение равное 0. В конце концов, прогоняя массив по циклу “for” выводим двоичное представление числа в 10-м виде. Вот и все, теперь посмотрите, что получилось:
    
    Процедура “Dec2Bin(int ch)”
    
    void Dec2Bin(int ch) {
    int i, ch2, s[n];
    ch2 = ch;
    for (i = 0; i < n; i++)
    s[i] = 0;
    for (i = 0; ch != 0; i++) {
    s[i] = abs(ch) % 2; //текущему значению массива s присваиваем 1 или 0
    ch = abs(ch) / 2;
    }
    if (ch2 < 0) {
    for (i = n - 1; i >= 0; i--)
    if (s[i] == 1)
    s[i] = 0;
    else
    s[i] = 1;
    }
    for (i = 0; i < n; i++)
    if (s[i] == 1) s[i] = 0;
    else {
    s[i] = 1;
    break;
    }
    }
    wcout << L"Двоичное представление :" << endl;
    for (i = n - 1; i >= 0; i--) //цикл вывода массива с введенным числом
    cout << s[i]; //представленным в двоичной системе счисления
    }
    
    Число в 2-м виде получили, но разве вам не хочется декодировать его обратно? Для начала напишем функции возведения числа в степень и получения длины массива, они нам понадобятся.
    
    Функция “len(char str[])”:
    
    int len(char str[])
    {
    int i = 0;
    while (str[i] != 0)
    i++;
    return i-1;
    }
    
    Функция “stepen(int ch, int st)”:
    
    int stepen(int ch, int st)
    {
    int a = 1;
    for(int i = 0; i < st; i++)
    a *= ch;
    return a;
    }
    
    Функция “len(char str[])” возвращает длину массива “str[]”, а “stepen(int ch, int st)” возводит число 2 в степень “st”.
    Теперь рассмотрим функцию “Bin2Dec (char m[])”, где “m[]”- это есть массив двоичных данных, в которых спрятано число. Если первый символ в массиве равен ‘1’, т.е. наше число отрицательное, то каждый символ в массиве до первой найденной ‘1’ инвертируем и после этого снова выполняет замену всех символов массива на ‘0’, если этот символ это ‘1’ или на ‘1’ соответственно. Затем непосредственно выполняем перевод в 10-й вид, используя нашу функцию возведения в степень. Код приведен ниже: 
    
    Функция “Bin2Dec (char m[])”:
    
    int Bin2Dec (char m[])
    {
    int i, deca=0, j = 0, q = 1;
    if (m[0] == '1')
    {
    for (i = n - 1; i >= 0; i--)
    if (m[i] == '0') m[i] = '1';
    else
    {
    m[i] = '0';
    break;
    }
    for (i = 0; i < n; i++)
    if (m[i] == '1')
    m[i] = '0';
    else
    m[i] = '1';
    q*=-1;
    }
    for (i = n - 1; i >= 0; i--, j++)
    if(m[i] == '1')
    deca += stepen(2,j);
    return deca*q;
    }
    
    Ну и, наконец, главная функция, с которой начинается работа нашего приложения. Здесь происходит ввод данных и вывод результата работы программы на экран пользователя.
    
    Главный метод:
    
    int main()
    {
    wcout.imbue(locale("rus_rus.866"));
    int ch;
    char c[n];
    wcout << L"Введите число (десятичное):" << endl; //вывод сообщения на экран
    cin >> ch; //ввод значения с клавиатуры
    Dec2Bin(ch);
    /*------------------------------------------------------------------------*/
    wcout << L"\n\nВведите число (двоичное):" << endl; //вывод сообщения на экран
    cin>>c; //ввод значения с клавиатуры
    wcout << L"Десятичное представление :" << endl << Bin2Dec(c) << endl; //выводим на экран число в 10-й системе счисления
    system("pause");
    return 1;
    }
    
    Используя данное приложение, вы с легкостью сможете переводить числа из десятичной системы счисления в двоичный вид и, наоборот, из двоичной системы счисления в десятичный вид. Желаю вам удачи!