Вы делаете неправильно. Вы пытаетесь построить такое число, чтобы если его вывести как десятичное, получилось двоичное представление числа.
Это не правильно, так делать не надо, это лишь приведёт к проблемам. Нужно различать само число (переменную числового типа) и его представление в той или иной системе счисления (строку).
#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 27 27 золотых знаков 290 290 серебряных знаков 521 521 бронзовый знак
да вы правы, есть очень много вариантов. человек выбрал это.
25 июн 2015 в 20:10
25 июн 2015 в 20:21
согласен вы правы
25 июн 2015 в 20:29
7 мая 2021 в 11:06
- Вы отрезаете последнее значение при num=num/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
Просто о двоичной системе счисления и двоичном коде. #1
Вот 2 функции, которые я когда-то давно писал.
Первая функция переводит из 10-ой системы счисления целые числа в любую другую систему счисления от 2 до 36.
std::string TransferDecimalToAny(long long int number, const unsigned int 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 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 = 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, 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
Источник: ru.stackoverflow.com
Перевод из десятичной системы в двоичную. Си/Си++
На данной странице расположены три функции языка си/си++, которые переводят десятичное число в двоичную систему счисления. Программы представлены как отдельно, так и в виде одной программы с тремя функциями с последующим вызовом их в 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», 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», 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()
Похожие материалы
- Перевод текста Erdbeben. Немецкий язык
- Перевод текста: Weit reichende Veränderungen..
- Напишите программу, печатающую значение EOF (Си)
- Даны целые числа K и N (N > 0).Вывести N раз число K.
- Перемножение матриц (Си/Си++)
- Сумма и умножение (Длинная арифметика) (Си/Си++)
- Overseas trade has been very important. Перевод текста
Источник: vopvet.ru
Перевод из десятичной системы счисления в двоичную в Python
Статьи
Автор Admin На чтение 2 мин Просмотров 6.6к. Опубликовано 24.03.2022
Введение
В этой небольшой статье рассмотрим перевод из десятичной системы счисления в двоичную в python. Рассмотрим функцию bin() и напишем свою программу для перевода из десятичной СС в двоичную.
Функция bin()
Начнём с того, что в python существует специальная функция для перевода из десятичной системы счисления в двоичную.
bin() – функция, преобразовывающая целое число в двоичную строку. В качестве параметра принимает десятичное число.
Для примера переведём число 15 в двоичную СС с помощью функции bin():
print(bin(15))
0b1111
Как мы видим, всё преобразовалось верно, ведь 15 в двоичной СС – это 1111.
Преобразование вручную
Перейдём к тому, что напишем код для преобразования десятичной СС в двоичную.
Получать двоичное число из десятичного мы будем путём нахождения остатков от деления на 2. При этом, число, полученное на предыдущей итерации выступает в качестве делимого в следующей итерации. Деление заканчивается, когда от числа остаётся ноль. Все полученные остатки собираются в двоичное число начиная с конца.
Для примера рассмотрим алгоритм перевода числа 15 в двоичную СС:
15 / 2 = 7, остаток 1
7 / 2 = 3, остаток 1
3 / 2 = 1, остаток 1
1 / 2 = 0, остаток 1
0 – конец деления
Итог: 11112
Теперь напишем код для реализации алгоритма:
number = int(input(‘Число в десятичной СС: ‘)) numberb = » while number > 0: numberb = str(number % 2) + numberb number = number // 2 print(numberb)
number – переменная, в которую вводится число в десятичной СС;
numberb – переменная, хранящая остатки от деления.
Вот мы и разобрались с вопросом перевода десятичной системы счисления в двоичную с помощью python.
Спасибо всем, кто читал, удачи Вам
Источник: it-start.online