Конвертировать десятичные данные в 32-битные двоичные файлы?

Вопрос:преобразовать положительное целое число в С++ (от 0 до 2 147 483 647) к 32-битовому двоичному и отображаемому. Я хочу сделать это традиционным "математическим" способом (а не использовать битрейт) или использовать вектор *.pushback * или рекурсивную функцию или что-то особенное на С++...), (одна причина заключается в том, что вы можете реализовать его на разных языках,

Вопрос:

преобразовать положительное целое число в С++ (от 0 до 2 147 483 647) к 32-битовому двоичному и отображаемому.

Я хочу сделать это традиционным “математическим” способом (а не использовать битрейт) или использовать вектор *.pushback * или рекурсивную функцию или что-то особенное на С++…), (одна причина заключается в том, что вы можете реализовать его на разных языках, ну может быть)

Итак, я иду и реализую простую программу вроде этого:

#include <iostream> using namespace std; int main() { int dec,rem,i=1,sum=0; cout << «Enter the decimal to be converted: «; cin>>dec; do { rem=dec%2; sum=sum + (i*rem); dec=dec/2; i=i*10; } while(dec>0); cout <<«The binary of the given number is: » << sum << endl; system(«pause»); return 0; }

Проблема заключается в том, что вы вводите большое число, например 9999, результат будет отрицательным или каким-то странным числом, потому что сумма является целой и не может обрабатывать больше, чем ее максимальный диапазон, поэтому вы знаете, что 32-битный двоичный файл будет иметь 32 цифры, поэтому он слишком велик для любого типа номера в С++?. Любые предложения здесь и о отображении 32-битного номера в качестве необходимого вопроса?

Лучший ответ:

Использование for-loop и предопределенного массива нулевых символов:

#include <iostream> using namespace std; int main() { int dec; cout << «Enter the decimal to be converted: «; cin >> dec; char bin32[] = «00000000000000000000000000000000»; for (int pos = 31; pos >= 0; —pos) { if (dec % 2) bin32[pos] = ‘1’; dec /= 2; } cout << «The binary of the given number is: » << bin32 << endl; }

По соображениям производительности вы можете преждевременно приостановить цикл for:

for (int pos = 31; pos >= 0 && dec; —pos)

Обратите внимание, что в С++ вы можете рассматривать целое число как логическое – все!= 0 считается истинным.

Ответ №1

То, что вы получаете в sum, вряд ли пригодно для использования, кроме печати. Это десятичное число, которое просто выглядит как двоичное.

Если десятичное двоичное преобразование не является самоцелью, обратите внимание, что числа в памяти компьютера уже представлены в двоичном формате (и это не свойство С++), и единственное, что вам нужно, это способ его печати. Один из возможных способов заключается в следующем:

int size = 0; for (int tmp = dec; tmp; tmp >>= 1) size++; for (int i = size — 1; i >= 0; —i) cout << ((dec >> i) & 1);

Другой вариант с использованием массива символов:

char repr[33] = { 0 }; int size = 0; for (int tmp = dec; tmp; tmp >>= 1) size++; for (int i = 0; i < size; ++i) repr[i] = ((dec >> (size — i — 1)) & 1) ? ‘1’ : ‘0’; cout << repr << endl;

Обратите внимание, что оба варианта не работают, если dec отрицательный.

Ответ №2

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

Ответ №3

Вы можете использовать целочисленный тип без знака. Однако даже с более крупным типом в конечном итоге вам не хватает места для хранения двоичных представлений. Вероятно, вам лучше хранить их в string.

Ответ №4

Как указывали другие, вам нужно сгенерировать результаты в
строка. Классический способ сделать это (который работает для любой базы между 2 и 36):

std::string toString( unsigned n, int precision, unsigned base ) { assert( base >= 2 && base <= 36 ); static char const digits[] = «0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ»; std::string retval; while ( n != 0 ) { retval += digits[ n % base ]; n /= base; } while ( retval.size() < precision ) { retval += ‘ ‘; } std::reverse( retval.begin(), retval.end() ); return retval; }

Затем вы можете отобразить его.

Ответ №5

рекурсии. В псевдокоде:

function toBinary(integer num) if (num < 2) then print(num) else toBinary(num DIV 2) print(num MOD 2) endif endfunction

Это не обрабатывает начальные нули или отрицательные числа. Стек рекурсии используется для обратного преобразования двоичных битов в стандартный порядок.

Ответ №6

Просто напишите:

long int dec,rem,i=1,sum=0

Вместо:

int dec,rem,i=1,sum=0;

Это должно решить проблему.

Оцените статью
Добавить комментарий