Вопрос:
преобразовать положительное целое число в С++ (от 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;
Это должно решить проблему.