Как перевести из десятичной в двоичную c
Перейти к содержимому

Как перевести из десятичной в двоичную c

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

Простите за банальный вопрос, но реально уже с пол часа лажу в нете немогу нормальной функции найти.
Напишите пож функцию.

Лучшие ответы ( 2 )

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

Ответы с готовыми решениями:

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

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

Перевод из десятичной(двоичной) системы счисления в двоичную(десятичную)
Всем добрый день, кто может помочь как можно реализовать данную задачу на С? Уже долго мучаюсь с.

Перевод из десятичной системы unsigned long long в двоичную c битовыми операциями, получается странный реультат
Доброго времени суток! Нужно выразить число в двоичной системе, показав все 64 символа.

Эксперт С++

2890 / 1825 / 356

Регистрация: 09.09.2010

Сообщений: 3,841

Elanso,

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#include //от 0 до 255 int main() { int dec, v; std::cin >> dec; v = 128; for(int i = 1; i  8; i++) { if(dec >= v) { std::cout  '1'; dec -= v; } else std::cout  '0'; v /= 2; } }

Перевод из десятичной в двоичную систему счисления C++

Вы делаете неправильно. Вы пытаетесь построить такое число, чтобы если его вывести как десятичное, получилось двоичное представление числа.

Это не правильно, так делать не надо, это лишь приведёт к проблемам. Нужно различать само число (переменную числового типа) и его представление в той или иной системе счисления (строку).

#include std::string to_binary_string(unsigned int n) < std::string buffer; // символы ответа в обратном порядке // выделим память заранее по максимуму buffer.reserve(std::numeric_limits::digits); do < buffer += char('0' + n % 2); // добавляем в конец n = n / 2; >while (n > 0); return std::string(buffer.crbegin(), buffer.crend()); // разворачиваем результат > 

Для случая, когда вам нужно обрабатывать и отрицательные числа, нужна небольшая модификация:

#include #include std::string to_binary_string(int n) < if (n == std::numeric_limits::min()) return "-1" + std::string(std::numeric_limits::digits, '0'); std::string buffer; buffer.reserve(std::numeric_limits::digits + 1); // +1 для минуса bool negative = (n < 0); if (negative) n = -n; do < buffer += char('0' + n % 2); n = n / 2; >while (n > 0); if (negative) buffer += '-'; return std::string(buffer.crbegin(), buffer.crend()); > 

Это решение естественно обобщается на произвольный тип:

#include #include #include template std::string to_binary_string(T n) < static_assert(std::is_integral::value, "Integer required."); if (std::numeric_limits::is_signed && n == std::numeric_limits::min()) // (*) < // переполнение в знаковом типе - UB, избегаем его return "-1" + std::string(std::numeric_limits::digits, '0'); > std::string buffer; buffer.reserve(std::numeric_limits::digits + 1); // +1 для возможного минуса bool negative = (n < 0); if (negative) n = -n; // это можно делать вследствие проверки (*) do < buffer += char('0' + n % 2); n = n / 2; >while (n > 0); if (negative) buffer += '-'; return std::string(buffer.crbegin(), buffer.crend()); > 

(Код частично украден из этого ответа.)

Величина std::numeric_limits::digits представляет количество бит в знаковом целочисленном типе, участвующих в представлении значения (без учёта знакового бита и битов заполнения (padding bits)), соответственно даёт количество двоичных цифр в самой длинной строке (за исключиением отрицательного минимума).

Отслеживать
ответ дан 25 июн 2015 в 20:05
206k 28 28 золотых знаков 293 293 серебряных знака 526 526 бронзовых знаков
да вы правы, есть очень много вариантов. человек выбрал это.
25 июн 2015 в 20:10

@SaidolimDjuraev: Мне кажется, что число, которое будучи выведенным как десятичное будет выглядеть, как двоичное представление другого числа, имеет достаточно слабую семантику. Кроме того, с строкой можно представить как угодно большие числа, а вот число 255 в двоичном виде будет 11111111 и не поместится в один байт в предлагаемой схеме.

25 июн 2015 в 20:21
согласен вы правы
25 июн 2015 в 20:29
@wololo: спасибо, с вашими правками вышло изящнее
7 мая 2021 в 11:06

  1. Вы отрезаете последнее значение при num=num/2; Это должно быть в конце цикла.
  2. Значения нужно выводить в обратном порядке.

Вот изменил код. Проверьте.

тут d это разряд. Потому что нужно обратно все печатать.

#include using namespace std; int main() < int num=0, t=0, d=1; cout"; cin>>num; while(num) < t +=(num%2)*d; //coutcout Отслеживать ответ дан 25 июн 2015 в 13:32 8,331 4 4 золотых знака 26 26 серебряных знаков 48 48 бронзовых знаков Вы имели в виду это? while(num) < t=num%2; cout<int a; int tmp = 1; std::cin >> a; if (a < 0) < a *= -1; std::cout if (a == 0) std::cout 1) < tmp = tmp >> 1; std::cout > 

Отслеживать
ответ дан 6 мая 2021 в 10:49
11 2 2 бронзовых знака
6 мая 2021 в 10:51

Вот 2 функции, которые я когда-то давно писал.

Первая функция переводит из 10-ой системы счисления целые числа в любую другую систему счисления от 2 до 36.

std::string TransferDecimalToAny(long long int number, const unsigned int &base) < const char *DIGITS = "0123456789abcdefghijklmnopqrstuvwxyz"; bool FlagInverse = false; std::string reversString, stringInBase; if (base < 2 || base >36) < std::cout if (number < 0) < FlagInverse = true; number *= -1; >stringInBase += DIGITS[number % base]; number = number / base; while (number) < stringInBase += DIGITS[number % base]; number = number / base; >if (FlagInverse == true) reversString = "-"; for (int i = stringInBase.length() - 1; i >= 0; i--) reversString += stringInBase[i]; return reversString; > 

А вторая функция также переводит из 10-ой системы счисления в любую другую систему счисления от 2 до 36, но только уже дробные числа причем с заданной точностью accuracy.

std::string TransferDecimalToAny(long double number, const unsigned int &base, const int &accuracy) < const char *DIGITS = "0123456789abcdefghijklmnopqrstuvwxyz"; int iter = 0, tmp = 0; bool FlagInverse = false; if (number < 0) < FlagInverse = true; number *= -1; >long long int integer; long double integer_tmp, fractional; std::string reversString, stringInBase; if (base < 2 || base >36) < std::cout fractional = modf(number, &integer_tmp); integer = static_cast(integer_tmp); stringInBase += DIGITS[integer % base]; integer = integer / base; while (integer) < stringInBase += DIGITS[integer % base]; integer = integer / base; >if (FlagInverse == true) reversString = "-"; for (int i = stringInBase.length() - 1; i >= 0; i--) reversString += stringInBase[i]; reversString += '.'; while (iter < accuracy) < fractional *= base; fractional = modf(fractional, &integer_tmp); tmp = static_cast(integer_tmp); reversString += DIGITS[tmp]; iter++; > return reversString; > 

А вызывать их соответственно следующим образом:

long long int number1 = -54605429; long double number2 = -6546747.63768658; std::cout > base; std::cout  

Перевод из десятичной системы в двоичную. Си/Си++

На данной странице расположены три функции языка си/си++, которые переводят десятичное число в двоичную систему счисления. Программы представлены как отдельно, так и в виде одной программы с тремя функциями с последующим вызовом их в main. Все программы проверены в Visual Studio.

Функция первая: реализация идеи при помощи массива (Си)

 #include "stdio.h" #include "conio.h" #include "locale.h" int main(int argc, char* argv[]) < setlocale(0, "rus"); int a, i, mass[99]; for (i = 0; i < 99; i++) < mass[i] = 0; >printf("Введите число: "); scanf_s("%d", &a); i = 0; while (a != 0) < if (a % 2 == 0) < mass[i] = 0; a = a / 2; >else < mass[i] = 1; a = a / 2; >i++; > i = i - 1; for (; i >= 0; i--) printf("%d", mass[i]); _getch(); return 0; > 

Пример работы программы:

Реализация программы при помощи побитового сдвига вправо (Си):

Данная программа очень схожа с предыдущей, отличие лишь в создании собственной функции и вызова его в main, а также использование побитового сдвига вправо вместо деления на 2.

 #include "stdio.h" #include "conio.h" #include "locale.h" int my_func(int a) < int i, mass[99]; for (i = 0; i < 99; i++) < mass[i] = 0; >i = 0; while (a != 0) < if (a % 2 == 0) < mass[i] = 0; >else < mass[i] = 1; >a = a >> 1; i++; > printf("В двоичной системе: "); i = i - 1; for (; i >= 0; i--) printf("%d", mass[i]); _getch(); return(0); > int main(int argc, char* argv[]) < setlocale(0, "RUS"); int a; printf("Введите целое десятичное число: "); scanf_s("%d", &a); my_func(a); //передаем в функцию число, которое нужно перевести > 

Пример работы программы:

Реализация программы при помощи рекурсивной функции (Си++):

 #include  #include "locale.h" using namespace std; void Func(int n) < if (n != 0) Func(n / 2); else return; printf("%d", n % 2); return; >int main() < setlocale(0, "RUS"); int n; cout > n; Func(n); return 0; >  

В нижний код собраны все предыдущие функции в одну программу с вызовом их в основной функции main. Программа на вход принимает 3 различных десятичных числа и считает их соответственно по алгоритмам, которые заданы в main.

 #include  #include "conio.h" #include "locale.h" int my_func2(int a) < int i, mass[99]; for (i = 0; i < 99; i++) < mass[i] = 0; >i = 0; while (a != 0) < if (a % 2 == 0) < mass[i] = 0; a = a / 2; >else < mass[i] = 1; a = a / 2; >i++; > i = i - 1; for (; i >= 0; i--) printf("%d", mass[i]); return 0; > void rekurs(int a) < if (a != 0) rekurs(a / 2); else return; printf("%d", a % 2); return; >int my_func(int a) < int i, mass[99]; for (i = 0; i < 99; i++) < mass[i] = 0; >i = 0; while (a != 0) < if (a % 2 == 0) < mass[i] = 0; >else < mass[i] = 1; >a = a >> 1; i++; > i = i - 1; for (; i >= 0; i--) printf("%d", mass[i]); return(0); > int main() 

Функция перевода из 10 в 2 в Си?

Доброго времени суток. Может есть у кого в снипетах функция перевода из 10-ной в 2-ную системы счисления на Си, поделитесь пожалуйста.
Заранее спасибо.

  • Вопрос задан более трёх лет назад
  • 30987 просмотров

Комментировать

Решения вопроса 0

Ответы на вопрос 1

ExeTwezz

int dec2bin(int num) < int bin = 0, k = 1; while (num) < bin += (num % 2) * k; k *= 10; num /= 2; >return bin; >

Ответ написан более трёх лет назад

yourtexthere @yourtexthere

После числа 1023 программа ламается, так как х = 1*10^9, кто знает как можно решить это?

Ваш ответ на вопрос

Войдите, чтобы написать ответ

c#

  • C#
  • +2 ещё

Как решить ошибку в VS при запуске кода?

  • 1 подписчик
  • 33 минуты назад
  • 8 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *