ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
 |
Перевод десятичного числа в двоичное на С++ |

22.10.2009, 09:10
|
|
Banned
Регистрация: 06.10.2009
Сообщений: 2
Провел на форуме: 15436
Репутация:
0
|
|
Перевод десятичного числа в двоичное на С++
Доброго времени суток всем, тут возникла задачка, - перевод десятичного числа в двоичное, по идее смысл я понял - в цикле число делится на 2 и возвращает остаток в ячейку массива, но хотелось бы решить эту задачу с помощью отдельной рекурсивной функции, я совсем новичок в программировании, если кому не сложно, подскажите 
|
|
|

22.10.2009, 09:38
|
|
Постоянный
Регистрация: 08.04.2007
Сообщений: 853
Провел на форуме: 5812656
Репутация:
1540
|
|
делаешь переменную-"извлекатель", которая изначально равна единице, потом в цикле делаешь AND её и исходного числа, результат даст 1 или 0 в нужном разряде, потом сдвигаешь извлекатель на единицу вправо.
|
|
|

22.10.2009, 12:33
|
|
Участник форума
Регистрация: 03.02.2009
Сообщений: 104
Провел на форуме: 270228
Репутация:
70
|
|
А зачем рекурсия?
Код:
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_;
}
|
|
|

23.10.2009, 00:29
|
|
Постоянный
Регистрация: 06.06.2007
Сообщений: 575
Провел на форуме: 1180737
Репутация:
180
|
|
Сообщение от Lohovoz
Доброго времени суток всем, тут возникла задачка, - перевод десятичного числа в двоичное, по идее смысл я понял - в цикле число делится на 2 и возвращает остаток в ячейку массива, но хотелось бы решить эту задачу с помощью отдельной рекурсивной функции, я совсем новичок в программировании, если кому не сложно, подскажите 
Код:
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;
}
вот те и рекурсия. Только она малясь кривая, и итоговую бинарную запись задом наперед выводит. Ну думаю развернуть ты сам сможешь, если приспичет 
|
|
|

25.10.2009, 10:24
|
|
Новичок
Регистрация: 09.11.2008
Сообщений: 11
Провел на форуме: 167671
Репутация:
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;
}
Используя данное приложение, вы с легкостью сможете переводить числа из десятичной системы счисления в двоичный вид и, наоборот, из двоичной системы счисления в десятичный вид. Желаю вам удачи!преобразовать десятичное число в двоичный вид на 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;
}
Используя данное приложение, вы с легкостью сможете переводить числа из десятичной системы счисления в двоичный вид и, наоборот, из двоичной системы счисления в десятичный вид. Желаю вам удачи!
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|